pytanie o nietypowe wysyłanie tekstu do aplikacji

0

W google przypadkiem znalazłem kod:

function SendMessageByString(hwnd:hwnd;msg: cardinal;wParam: integer;lParam: AnsiString):integer;
stdcall;external 'user32.dll' name 'SendMessageA';

stringa na asistringa zamieniłem

no i ten kod funkcji zamieściłem pod:

implementation

{$R *.dfm}

//tu ta funkcja

No i użycie funkcji, szukam uchwytu do np. pola na tekst w notepadzie, już na szybko podałem wprost uchwyt:
h:= $1207dc;
SendMessageBystring(h, WM_SETTEXT, 0, 'brawo lalala');

no i działa kod, funkcja wysyła do notatnika od razu cały tekst

No i o co chodzi? Po co tu zakładam temat?
Skoro kod działa, a go nie rozumiem, to muszę koniecznie was poprosić o wytłumaczenie, omówienie tego kodu.

function SendMessageByString(hwnd:hwnd;msg: cardinal;wParam: integer;lParam: AnsiString):integer;
stdcall;external 'user32.dll' name 'SendMessageA';

Po kolei:

  1. Przyzwyczajony jestem do tego, że pisząc funkcję, ma ona jeszcze pod "begin" jakiś kod do zrobienia, a tutaj tego nie ma i to mnie zdziwiło, bo po prostu innych funkcji nie miałem okazji używać.
    Czyli, że co, mogę sobie napisać funkcję, a po niej dopisać external 'nazwa_bibliteki' name 'nazwa funkcji';?? i wtedy nie muszę pisać begin itd, bo ta moja funkcja będzie tak jakby funkcją z biblioteki?

 external 'user32.dll' name 'SendMessageA'; 

ok, SendMessageA jest w dllce user32, czyli to chyba rozumiem, ale patrząc na budowę funkcji SendMessageA lParam jest typu Integer, a tu sobie mogłem dać AnsiString, dlaczego?

Zatem zwracam się z prośbą o wyjaśnienie tego kodu. Dziękuję

1

Zmienić tekst w kontrolce możesz również w sposób następujący:
var msg:AnsiString;
msg:='brawo lalala';
SendMessage(h, WM_SETTEXT, 0, Integer(PChar(msg)));
SendMessage zadeklarowano jako:
function SendMessage(hwnd:hwnd;msg: cardinal;wParam: integer;lParam: integer):integer;
stdcall;external 'user32.dll' name 'SendMessageA';
Oznacza to że funkcja już została napisana i umieszczona w dynamicznej bibliotece user32.dll, ty jedynie wskazujesz że wywołując
SendMessage(...) oczekujesz wywołania funkcji o nazwie SendMessageA znajdującej się w tej bibliotece.
Aby nie robić tej podwójnej konwersji możesz zrobić sobie dodatkowe "wejście" do tej samej funkcji, czyli:
function SendMessageByString(hwnd:hwnd;msg: cardinal;wParam: integer;lParam: AnsiString):integer;
stdcall;external 'user32.dll' name 'SendMessageA';
i wywołujesz wtedy:
var msg:AnsiString;
msg:='brawo lalala';
SendMessageByString(h, WM_SETTEXT, 0, msg);
W obu przypadkach funkcja SendMessageA z biblioteki user32.dll dostanie te same parametry, więc zrobi to samo.

0

aha, to takie buty ;)
Dziękuję bardzo. Fajna sprawa i dobrze, że napisałeś o Integer(PChar, bo chyba głównie dzięki temu hmm zrozumiałem czemu AnsiStringa mogłem podać. Dzięki.

btw. a nie denerują cię w necie kody, gdzie ludzie często olewają spacje, piszą wszystko z małych literek i później funkcja wygląda w stylu: nazwafunkcji(cos:handle;sprawdz:boolean;blabla:dword):byte;
jednym słotem tragedia takie funkcje :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1