In vielen Programmen sieht man, dass z.B. der Status eines Buttons vom Vorhandensein eines Textes im Eingabefeld abhängig ist. Erst wenn Text vorhanden ist, wird also der Button aktiviert. Im herkömmlichen VCL-Weg eignet sich dazu am besten das "OnChange"-Ereignis:
procedure TForm1.Edit1Change(Sender: TObject);
begin
MachWeiterKnopf.Enabled := (Edit1.Text <> '');
end;
Bei der API-Programmierung sind es ein paar Zeilen mehr, aber das Ergebnis ist letzten Endes das selbe. Zuerst erzeugen wir einen deaktivierten Button, wozu wir das Attribut WS_DISABLED benutzen:
MachWeiterBtn := CreateWindowEx(0, 'BUTTON', 'Weiter >', WS_VISIBLE or WS_CHILD {neuer Stil ->} or WS_DISABLED, 220, 65, 150, 25, hWnd, IDC_BUTTONADDSTR, hInstance, nil);
Dann benötigen wir die Nachricht "EN_CHANGE", die als höherwertiger Anteil des wParam-Parameters von "WM_COMMAND" übermittelt wird. Diese Nachricht signalisiert, dass sich im Eingabefeld etwas verändert hat:
WM_COMMAND:
case hiword(wParam) of
EN_CHANGE:
if loword(wParam) = IDC_EDIT1 then
begin
{ ... }
end;
end;
Im niederwertigen Anteil finden Sie die ID des Controls, so dass Sie gezielt prüfen können. Im dritten und letzten Schritt lesen Sie den vorhandenen Text aus dem Control aus und prüfen das Rückgabeergebnis. Dazu können Sie die Nachricht "WM_GETTEXT" (in Verbindung mit "SendMessage") oder "GetWindowText" verwenden. Beide liefern die Anzahl der kopierten Zeichen zurück, so dass Sie davon ausgehen können, dass nur Text vorhanden ist, wenn das Ergebnis größer als Null ist. Abhängig davon aktivieren Sie den Button, oder Sie lassen ihn deaktiviert:
EnableWindow(MachWeiterBtn,GetWindowText(hEdit1,buffer,256) > 0);