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

Вниз

Getclassname   Найти похожие ветки 

 
SeF   (2002-04-02 02:57) [0]

подскажите что не так?
procedure TForm1.Timer1Timer(Sender: TObject);
var
p: TPoint;
name:string;
begin
setlength(name,255);
//fillchar(name,255,#0);
GetCursorPos(p);
GetClassName(WindowFromPoint(p),@name,255);
edit1.Text:=name; {1}
end;


в 1 все время "Access violation at address 00404242 in module Project1.exe" read of address 726F464C
компилится без проблем...


 
SoftOne   (2002-04-02 03:50) [1]

Читаем хелп по GetClassName. И видим, что вторым параметром в ней идет "LPTSTR", т.е. "Long Pointer To String", т.е. PChar.
"name" у тебя "string" - это плюс! Но @name - это минус, поскольку указывает не на область данных, а на "область указателя на область данных"!


 
SeF   (2002-04-03 02:10) [2]

>SoftOne
вместо
edit1.Text:=name;
нвписать
messagebox(0,pchar(name),pchar(""),0);
то все ok
да и если name:pchar; то таже самая ошибка...


 
Adder   (2002-04-04 00:21) [3]

GetClassName(WindowFromPoint(p),@name[1],255);


 
Doom   (2002-04-04 00:24) [4]

А вачале p:= Create (TPoint) или как там не надо писать?


 
Adder   (2002-04-04 00:27) [5]

2Doom ;)
type TPoint = record
X: Longint;
Y: Longint;
end;


 
SeF   (2002-04-04 02:27) [6]

>Adder © после выхода из проседуры проходит 1-2 sec и access violation at 0x00000000: read address 0x00000000.
а класс не показывает


 
SeF   (2002-04-04 02:56) [7]

последние испытания:

procedure TForm1.Button1Click(Sender: TObject);
var
p: TPoint;
name:string;
begin
sleep(2000);
//str:=tstringlist.Create;
setlength(name,255);
fillchar(name,255,#0);
GetCursorPos(p);
if GetClassName(WindowFromPoint(p),@name,255)>0 then
messagebox(0,@name,pchar("11111"),0)
else
messagebox(0,pchar(inttostr(GetLastError)),pchar("11111"),0);
//edit1.Text:=name;
//str.Free;
end;


в итоге через 1-2 sec получаем http://seff.pisem.net/images/error.jpg


 
Fantasist   (2002-04-04 05:46) [8]

Эхе-ех. :)
Вот, получите. :)

procedure TForm1.Button1Click(Sender: TObject);
var
p: TPoint;
name:PChar;
begin
sleep(2000);
name:=StrAlloc(255);
GetCursorPos(p);
if GetClassName(WindowFromPoint(p),name,255)>0 then
messagebox(0,name,pchar("11111"),0)
else
messagebox(0,pchar(inttostr(GetLastError)),pchar("11111"),0);
end;


 
Fantasist   (2002-04-04 05:53) [9]

Да, пару комментариев.
1. Как вам выше сказали, если у вас name типа string, то адрес ее надо передавать как @name[1], иначе вы передаете не адрес строки, а адрес указателя и облом.
2. Не стоит забивать ANSI строку нулями - ноль символ окончания строки.
То есть так тоже будет работать:

procedure TForm1.Button1Click(Sender: TObject);
var
p: TPoint;
name:string;
begin
sleep(2000);
setlength(name,255);
GetCursorPos(p);
if GetClassName(WindowFromPoint(p),@name[1],255)>0 then
messagebox(0,@name[1],pchar("11111"),0)
else
messagebox(0,pchar(inttostr(GetLastError)),pchar("11111"),0);
end;



 
SeF   (2002-04-04 13:49) [10]

>Fantasist
проблема в том что проседура выполнятся, а ошибка после выхода из процедуры......


 
Romkin   (2002-04-04 14:10) [11]


procedure TForm1.Timer1Timer(Sender: TObject);
var
p: TPoint;
WndName:string;
Wnd: HWnd;
nSize: integer;
begin
GetCursorPos(p);
Wnd := WindowFromPoint(p);
SetLength(wndName,255); //max
nSize := GetClassName(Wnd,PChar(WndName),255);
if nSize = 0 then exit; //Error
SetLength(WndName,nSize + 1);
nSize := GetClassName(Wnd,PChar(WndName),nSize + 1);
edit1.Text:=WndName;
end;


 
Fantasist   (2002-04-04 22:30) [12]

>проблема в том что проседура выполнятся, а ошибка после выхода >из процедуры......

ПОСЛЕ выхода? Ну, тогда дело в чем-то другом. У меня так все четко, оба кода которые я привел работают совершенно коректно. Ты их у себя пробывал?


 
SeF   (2002-04-05 01:00) [13]

Всем БОЛЬШОЕ СПАСИБО! заработало. Ошибка вылетала действительго после выхода, но после изменения кода действительно ВСЕ ok. еще рас спасибо!


 
Fantasist   (2002-04-05 02:48) [14]

Естесвенно,она вылетала после выхода, так как ты передавал переменную типа string изменялся сам указатель, и исключение происходило когда компилятор пытался удалить память из под string которая указывала неизвестно куда.



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

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

Наверх





Память: 0.47 MB
Время: 0.006 c
1-57819
dr_neo_rostov
2002-04-05 14:24
2002.04.18
Двоичный вид числа и строки


3-57594
VAleksey
2002-03-26 12:25
2002.04.18
ADO


1-57683
Roman9
2002-04-07 16:33
2002.04.18
Как запустить из одной программы другую


1-57759
Митрий
2002-04-05 16:32
2002.04.18
Помогите чайнику. Не разобраться с TExcelworksheet


3-57586
TriNeT
2002-03-25 06:36
2002.04.18
Вопрос по ADO+ODBC+Paradox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский