Dynamiczne tworzenie komponentów w wątku – "Nieprawidłowe dojście okna."

0

Witam. Wywołuję wątek w FormShow:

procedure TMainForm.FormShow(Sender: TObject);
var
  ThreadId : Cardinal;
begin
 CreateThread(nil, 0, @GetListThreadProc, nil, 0, ThreadId);
end;

I tworzę nowe komponenty w wątku :

var
  i : Integer;
  Btn : TButton;
begin
  for i := 0 to 19 do
    begin
      Btn := TButton.Create(ScrollBox1);
      Btn.Enabled := True;
      Btn.Visible := True;
      Btn.Name := 'sButton'+IntToStr(i);
      Btn.ShowHint := True;
      Btn.Hint := 'This is a hint number "'+IntToStr(i)+'"';
      Btn.Font.Size := 10;
      Btn.Height := 62;
      Btn.Top := Btn.Height * i + 10;
      Btn.ImageIndex := 0;
      Btn.Tag := i;
      Btn.Align := alTop;
      Btn.Caption := 'This is button '+Format('%.2d',[i]);
      Btn.Parent := ScrollBox1; // Błąd.
    end;
end;

Wyskakuje mi błąd "Nieprawidłowe dojście okna." Jak wyeliminować ten błąd?

1

Komponenty VCL nie mogą być modyfikowane w wątku innym niż główny aplikacji (masz błąd ponieważ button uzyskuje rodzica zaczyna przyjmować komunikaty a tu wtopa, bo inny wątek się wpie*). Nie wiem po co ten wątek do tworzenia komponentów albo tworzysz wszystko bez wątku albo jeżeli to konieczne używaj wątku ale do tworzenia komponentów używaj Synchronize . Co to za wersja Delphi, tworzenie wątków bezpośrednio funkcjami WinApi jakby w Delphi nie było odpowiednich obiektów.

0

Dobrze. A jak wywołać procedurę OnClick konkretnego przycisku, aby nie pisać 19 funkcji?

1

A kto zabroni Ci tej samej procedury OnClick przypisać wszystkim 19 przyciskom wystarczy tą samą ustawić w Object Inspector. Programowe wywołanie to procedury OnClick to po prostu Button1.Click;
Procedura OnClock ma parametr Sender dzięki któremu łatwo można zorientować sie o który przycisk chodzi np. po Name albo jeżeli sobie ustawimy to poTag itp.

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(TButton(Sender).Name);
end;
0

Dzięki.

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