2013-12-06 1 views
4

Я пытаюсь перевести пример кода в Delphi из документов Advantage Database, но, похоже, не может корректно получать объявления переменных, начиная с varType, а также не может определить MAX_STR_LEN (константа, функция, что-то еще?).Как конвертировать API Advantage Пример кода C Delphi

Вот код в образце:

UNSIGNED32 DoDates(void) 
{ 
     ADSHANDLE hTable; 
     UNSIGNED16 usLength; 
     UNSIGNED8 aucDOB[MAX_STR_LEN+1]; 
     ... 
     usLength = MAX_STR_LEN+1 
     AdsGetDate(hTable, "DOB", aucDOB, &usLength); 
     ... 
} 

код Delphi Я попытался это:

procedure TForm1.fixARInvoiceEntryHeaderDates; 
var 
     tableHandle:ADSHandle; 
     aucDOB:pansichar; 
     usLength:punsigned16; 

begin 
     ... 
     AdsGetDate(
     tableHandle, 
     'inv_date', 
     aucDOB, 
     &usLength); 
     ... 
end; 
+2

Как вы уже знаете, у Advantage есть набор компонентов Delphi, которые являются потомками TDataSet? Они делают это так, что вы можете использовать обычные операции таблицы или запроса и поля доступа с помощью 'Table.FieldByName ('DOB'). AsDateTime'. Они свободны от веб-сайта Advantage. –

+0

Да, спасибо. Я только делаю это, чтобы исправить поврежденное значение даты (функции TAdsTable вызывают ошибку 5095). –

ответ

5

MAX_STR_LEN определяется как 255 в Advantage Client Engine Sample Code раздел справки, в самой верхней части страницы, которую вы указали для образца DoDates. Они заявляют об этом так, потому что они используют его во всем образце кода, поэтому он достаточно велик, чтобы использоваться для возврата различных типов данных (строковое содержимое символа, даты и других типов).

Если вы собираетесь использовать буфер специально для получения дат, вы можете использовать гораздо меньший размер буфера, так как ни один из типов дат или форматов ADS не находится где-то рядом. (Я использовал размер буфера 49 символов однобайтными (байт) в моем примере ниже, который до сих пор, по крайней мере 2х размера он должен быть.)

Что-то, как это должно работать:

// Reduced because of intended use. See text above, 2nd paragraph. 
// If you're using this buffer for things other than dates, 
// change to 255 as original code did. 

const 
    MAX_STR_LEN = 49; 

type 
    TCharDateBuffer = array[0..MAX_STR_LEN + 1] of AnsiChar; 

var 
    DateBuffer: TCharDateBuffer; 
    BuffSize: UNSIGNED16;  // From Ace.pas 
    tableHandle: ADSHandle;  // From Ace.pas 
begin 
    // Your code to open the table and get the handle 

    BuffSize := MAX_STR_LEN; 
    AdsGetDate(tableHandle, 'DOB', DateBuffer, @BuffSize); 
end; 

Однако, если вы используете их компоненты TDataSet descendant, это намного проще, например, TAdsTable или TAdsQuery). Затем вы можете использовать обычные TField свойства:

// Retrieve DOB as string 
StrDOB := MyAdsTable.FieldByName('DOB').AsString; 

// Get DOB as TDateTime 
DOB := MyAdsTable.FieldByName('DOB').AsDateTime; 

// Set date field to today 
MyAdsTable.FieldByName('CHANGED').AsDateTime := Date; 

В `компонентов TDataSet Advantage доступны с их страниц Product Downloads; нажмите ссылку для версии Advantage, которую вы используете, и вы найдете ссылку на компоненты на странице, которые для этой версии.

+0

Очень полезно, спасибо Кен! –

Смежные вопросы