![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
UDF [D7, XP]
Irish_34 © (2007-12-10 20:02:00)Привет ВСЕМ, помогите пожалусто UDF, начиная работать в процедуре "спотыкается" об чего, я уже не знаю в чем и ошибка и чге я некоректно что обозвала
DECLARE EXTERNAL FUNCTION CEX6
VARCHAR(50)
RETURNS VARCHAR(50) BY DESCRIPTOR
ENTRY_POINT 'psc6' MODULE_NAME 'PDL6.dll'
function psc6(var s:PChar):PChar;cdecl;export;
var
j1,i1:byte;
j: PSmallInt;
s1: string;
begin
j:=nil;
j1:=0;
i1:=0;
if ((s=nil) or (s='0') or (s='')) then
Result:='0'
else
if StrPos(s,'6')<>nil then
begin
j:=PSmallInt(StrPos(s,'6'));
s1:=PChar(s)^;
Result:='';
delete(s1,1,j^+1);
if Length(s1)=1 then //s:=copy(s1,1,1)
StrPLcopy(Result,s1,1)
else
begin
for i1:=1 to length(s1) do
if ((s1[i1]=',') or (s1[i1]='.') or (s1[i1]=';') or (s1[i1]=' '))
then
begin
delete(s1,i1,length(s1));
StrPLcopy(Result,s1,length(s1));
end
else StrPLcopy(Result,s1,2);
end;
end
else
Result:='';
end;
irish_34 (2007-12-28 20:48:00) [1]
> Держи, горемычная)
:* спасибо огромное, но и твоя и моя работают только начиная с 1.5 FB, а 1.0FB...даже и не знаю как он может работать с UDF.и я сделала проще установила 1.5
Сергей М. (2007-12-27 09:57:00) [2]Держи, горемычная)
DECLARE EXTERNAL FUNCTION CEX6
CSTRING(32767)
RETURNS PARAMETER 1
ENTRY_POINT 'psc6' MODULE_NAME 'PDL6.dll'
function psc6(AString:PChar):PChar; cdecl;
function ExtractSubstring(AString: String): String;
const
ld: PChar = '.,; ';
rd: PChar = '.,; )';
var
i,n,k,b: Integer;
function IsDelimiter(ADelimiters: PChar; ASymbol: Char): Boolean;
var
i: Integer;
begin
i := 0;
Result := False;
while (i < n) and not Result do
begin
Result := ASymbol = ADelimiters[i];
Inc(i);
end;
end;
begin
Result := '0';
if AString[1] <> '6' then Exit;
i := 2;
k := Length(AString);
n := StrLen(ld);
while (i <= k) and not IsDelimiter(ld, AString[i]) do Inc(i);
Inc(i);
b := i;
n := StrLen(rd);
while (i <= k) and not IsDelimiter(rd, AString[i]) do Inc(i);
Result := Copy(AString, b, i-b);
if Result='' then Result := '0';
end;
begin
Result := lstrcpy(AString, PChar(ExtractSubstring(AString)));
end;
irish_34 (2007-12-26 18:19:00) [3]6-ка всегда является первым символом строки
Сергей М. (2007-12-26 09:22:00) [4]
> irish_34 (25.12.07 18:54) [93]
Т.е. в интересующих тебя строках 6-ка всегда является первымсимволом строки ? Или есль другие варианты, где 6-ка не первый символ ?
Например, 7. 6. 15п.11.15 ?
irish_34 (2007-12-25 19:05:00) [5]
> Внимательно прочитай статью указанную в [1], хорошая статья
ды читала я, что конкретно не так-то?
trubin (2007-12-25 19:02:00) [6]Внимательно прочитай статью указанную в [1], хорошая статья
irish_34 (2007-12-25 18:56:00) [7]
> Что, проблема даже скопировать шаблон из [18] "один в один"
> ?)
Переделывала жи
irish_34 (2007-12-25 18:54:00) [8]
> Приведи десяток различных возможных вариантов строковых
> значений, которые ожидаются в кач-ве параметров твоей ф-
> ции, и выдели в них жирным подстроки, которые должна возвращать
> ф-ция ..
6, 4,10
6(рез); 7;103;5
6. 8.12.10.9
6. 21.15.21.5.21
6. 15п.11.15
6. 10 чпу
6. 5.15.5.7.5.7.5
6. 15(рихт.)8.15.13(шл.)8 чпу
palva (2007-12-25 13:10:00) [9]Desdechado © (25.12.07 12:15) [91]
OK
Desdechado (2007-12-25 12:15:00) [10]> palva © (25.12.07 12:10) [90]
Разница выделена была в том посте, который ты комментировал вначале. Это соглашение о вызовах stdcall.
А имена, которые ты зацепил, действительно синонимы, с этим я и не спорю.
palva (2007-12-25 12:10:00) [11]
> Desdechado © (25.12.07 11:15) [88]
> > lstrcpy, lstrcpyA - это без разницы.
> Разница выделена.
Вообще да. Разница есть. В имени. Но я имел в виду, что без разницы, какое имя указывать. Это одна и та же функция.
{$APPTYPE CONSOLE}
uses Windows;
var
h: THandle;
f: FarProc;
begin
h := LoadLibrary('Kernel32.dll');
f := GetProcAddress(h, 'lstrcpy');
WriteLn(Integer(f)); // 2088812033
f := GetProcAddress(h, 'lstrcpyA');
WriteLn(Integer(f)); // 2088812033
end.
Сергей М. (2007-12-25 11:56:00) [12]
> irish_34 (24.12.07 22:04) [83]
>
>
Приведи десяток различных возможных вариантов строковых значений, которые ожидаются в кач-ве параметров твоей ф-ции, и выдели в них жирным подстроки, которые должна возвращать ф-ция ..
Desdechado (2007-12-25 11:15:00) [13]> lstrcpy, lstrcpyA - это без разницы.
Разница выделена.
Сергей М. (2007-12-25 08:21:00) [14]
> irish_34 (24.12.07 22:03) [82]
> используется один общий менеджер
Общий с кем?
> irish_34 (24.12.07 22:29) [85]
Отсебячина.
В [18] ф-ция декларирована иначе.
Что, проблема даже скопировать шаблон из [18] "один в один" ?)
palva (2007-12-24 22:58:00) [15]trubin © (24.12.07 19:18) [76]
Вот это справедливо.
irish_34 (2007-12-24 22:29:00) [16]
> Еще, Напишите здесь, как вы описали UDF в FireBird.
DECLARE EXTERNAL FUNCTION CEX6
CSTRING(50)
RETURNS CSTRING(50)
ENTRY_POINT 'psc6' MODULE_NAME 'Pr1.dll'
palva (2007-12-24 22:15:00) [17]> ххх
Тогда содержательно ваша программа работает неправильно. Возможно из-за ошибок, которых вы не ожидали, на ваших тестовых данных где-нибудь переполняется буфер.
> проблема я так поняла в некорректной работе с PChar
А для проверки работы с PChar можно временно выкинуть всю начинку и присвоить выходному параметру константное значение. По-крайней мере поймете, из-за чего программа валится.
Еще, Напишите здесь, как вы описали UDF в FireBird.
irish_34 (2007-12-24 22:04:00) [18]
> Ваша программа должна выделить из нее строку 'yyy' Так?
ххх, но это не важно что происходит со строками, проблема я так поняла в некорректной работе с PChar
irish_34 (2007-12-24 22:03:00) [19]
> А смысл?
чтоб менше ошибок было как ещё в одном разговоре написано, используется один общий менеджер
palva (2007-12-24 21:38:00) [20]Никак не могу приспособиться к вашей логике. Возьмем, например, такую строку:
'1234 5 6;xxx,yyy'
Ваша программа должна выделить из нее строку 'yyy' Так?