Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

От Delphi 7 к Delphi 2010   Найти похожие ветки 

 
Alexsis f ©   (2010-03-15 11:28) [0]

Вот блок моего исходника, написанного когда-то на Delphi 7. Программа посредствам GetKeyNameText помещает значение нажатой клавиши в переменную Buffer. В связке Delphi 7 и Win XP все работает отлично. Под Win 7 в среде D2010 возникли проблемы - данные в файл возвращаются в неправильной кодировке. Из мануала узнал, что D2010 типы Char и PChar, которые ранее соответствовали AnsiChar и PAnsiChar, соответственно стали WideChar и PWideChar. Как следствие, все заголовочные файлы для работы с WinAPI изменены под юникод. Пытался Char и PChar заменить на AnsiChar и PAnsiChar - не вышло. GetKeyNameText и BlockWrite не хотят работать с AnsiChar. Подскажите, как исходник зделать совместимым с Win 7 и рабочим в D2010. Спасибо.

var
Buffer: array[0..1000] of char;
SzKeyName: array[0..100] of char;

//StrLen, StrCopy,StrEnd взяты из D7 (в D2010 они другие)

function StrLen(const Str: PChar): Cardinal; assembler;
asm
mov edx, edi
mov edi, eax
mov ecx, 0FFFFFFFFh
xor al, al
repne scasb
mov eax, 0FFFFFFFEh
sub eax, ecx
mov edi, edx
end;

function StrCopy(Dest: PChar; const Source: PChar): PChar; assembler;
asm
push edi
push esi
mov esi, eax
mov edi, edx
mov ecx, 0FFFFFFFFh
xor al, al
repne scasb
not ecx
mov edi, esi
mov esi, edx
mov edx, ecx
mov eax, edi
shr ecx, 2
rep movsd
mov ecx, edx
and ecx, 3
rep movsb
pop esi
pop edi
end;

function StrEnd(const Str: PChar): PChar; assembler;
asm
mov edx, edi
mov edi, eax
mov ecx, 0FFFFFFFFh
xor al, al
repne scasb
lea eax, [edi-1]
mov edi, edx
end;

function StrCat(Dest: PChar; const Source: PChar): PChar;
begin
StrCopy(StrEnd(Dest), Source);
Result := Dest;
end;

procedure EmptyBuffer;//Крпирование буфера в файл
var
F: File;
begin
GenerateFileName;
AssignFile(F, FileName);
if FileExists(FileName) then
begin
Reset(F, 1);
Seek(F, FileSize(F));
end
else
Rewrite(F, 1);
BlockWrite(F, Buffer, StrLen(Buffer));
CloseFile(F);
FillChar(Buffer, SizeOf(Buffer), chr(0));
end;

procedure SaveData(D: PChar);//Заполнение буфера
begin
StrCat(Buffer, D)
end;

//Функция заполнения "SzKeyName"
GetKeyNameText(lParam, SzKeyName, SizeOf(SzKeyName));
SaveData(SzKeyName);


 
Anatoly Podgoretsky ©   (2010-03-15 11:35) [1]

GetKeyNameText работает с AnsiString, а ты лезешь в АСМ не понимая.


 
Anatoly Podgoretsky ©   (2010-03-15 11:42) [2]

Не понимаешь относится к ассемблеру, читать о calling convention и рядом.


 
Игорь Шевченко ©   (2010-03-15 12:31) [3]


> GetKeyNameText и BlockWrite не хотят работать с AnsiChar


нормально работают


 
Alexsis f ©   (2010-03-15 12:52) [4]


> > GetKeyNameText и BlockWrite не хотят работать с AnsiCharнормально
> работают

Я безусловно соглашусь с этим. Если бы Char в новых версиях Делфи небыл изменен на WideChar - все было бы в порядке.


 
Игорь Шевченко ©   (2010-03-15 13:01) [5]

Alexsis f ©   (15.03.10 12:52) [4]

BlockWrite-у вообще пофиг, какой тип ему передается.

строки и указатели на Char можно приводить к AnsiString и PAnsiChar, безболезненно.


 
Alexsis f ©   (2010-03-15 13:15) [6]

в Delphi 2010 функции StrLen, StrCopy,StrEnd в качестве параметров используют AnsiChar и PAnsiChar. Как мне быть с функциями GetKeyNameText() и GetWindowText(), которые могут возвращать только WideChar?


 
Сергей М. ©   (2010-03-15 13:19) [7]

GetKeyNameTextA
GetWindowTextA


 
Ega23 ©   (2010-03-15 13:33) [8]

Как раз утром письмо пришло:

Уважаемый коллега!

Приглашаем Вас 25 марта 2010 г. в 12.00 (по московскому времени) принять участие в вебинаре "Delphi 2010: вопросы миграции".

Новая версия Delphi 2010 дает разработчику ряд преимуществ как с точки зрения повышения производительности за счет возможностей IDE, так и в плане развития языковых возможностей и компонентного состава. Однако миграция проектов с предыдущих версий требует определенных знаний о нововведениях, которые могут повлиять на степень модификации исходного кода.

В ходе вебинара рассматриваются основные шаги, которые необходимо предпринять для обеспечения наиболее плавной и безболезненной миграции существующих проектов, созданных в ранних версиях Delphi. Особое внимание уделяется поддержке Unicode и анализу потенциальных проблем преемственности программного кода.

Вебинар проводит Всеволод Леонов, менеджер по продуктам Embarcadero Technologies.
Предварительная регистрация на вебинар является обязательной.
Регистрация доступна по адресу:
http://www.embarcadero-events.eu/ru/rad_studio_2010_webinar.html

После заполнения регистрационной формы на указанный электронный адрес будет направлена информация, необходимая для подключения к вебинару.


 
Игорь Шевченко ©   (2010-03-15 13:47) [9]


> Как мне быть с функциями GetKeyNameText() и GetWindowText(),
>  которые могут возвращать только WideChar?


function foo(ScanCode: Integer): AnsiString;
var
 KeyName: array[0..255] of Char;
begin
 Result := "";
 if ScanCode <> 0 then
 begin
   GetKeyNameText(ScanCode, KeyName, SizeOf(KeyName));
   Result := AnsiString(string(KeyName));
 end;
end;


Например так


 
Alexsis f ©   (2010-03-15 13:49) [10]

Всем огромное спасибо за советы. Особая благодарность Сергею М. Исходник удалось партировать на D2010. Изменил все заданные переменные Char на AnsiChar, сделал теже изменения в параметрах функций, заменил GetKeyNameText и GetWindowText на GetKeyNameTextA на GetWindowTextA соответственно. И все заработало!



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.06 c
15-1265977848
TStas
2010-02-12 15:30
2010.08.27
Из любопытства: как функция возвращает значение?


15-1264368629
Юрий
2010-01-25 00:30
2010.08.27
С днем рождения ! 25 января 2010 понедельник


2-1265924438
azatsh
2010-02-12 00:40
2010.08.27
pointer to cardinal or to longint ?


15-1271830825
12
2010-04-21 10:20
2010.08.27
Apache2.2. Странный глюк


15-1268204901
DOOM
2010-03-10 10:08
2010.08.27
что можно узнать по ip-адресу?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский