Dynamiczne komponenty na Dynamicznej formie

0

Witam mam problem z sworzeniem eventu OnClick na przycisku stworzonym dynamicznie na Formie która tez jest tworzona w sposób dynamiczny
Potrzebuje pobrac wartość z myEdit do 2 kolumny ListView która jest stała na Form1
A sam proces tworzenia wygląda w ten sposób:

procedure TForm2.ListView1SelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
  var
  Form3:TForm;
  myButton : TButton;
  myEdit : TEdit;
  myLabel : TLabel;

begin
  Form3 := TForm.Create(Application);
  //Dynamiczne tworzenie komponentów na onie dialogowym ilości przedmiotów
  myButton := TButton.Create(Form3);
  myEdit := TEdit.Create(Form3);
  myLabel := TLabel.Create(Form3);


  {Dynamiczne nadanie wartosci komponentów}
  //Wartosci formy 3
  Form3.Width := 150;
  Form3.Height := 120;

  //Pole opisu wybranego przedmiotu
  myLabel.Top := 5;
  myLabel.Left := 20;
  myLabel.Caption := 'Ile potrzebujesz ' + Item.Caption;
  myLabel.Parent := Form3;

  //Pole wpisania liczbczy przedmiotów
  myEdit.Top := 20;
  myEdit.Left := 20;
  myEdit.Width := 50;
  myEdit.NumbersOnly := True;
  myEdit.Parent := Form3;

  //Przycisk dodaj
  myButton.Top := 50;
  myButton.Left := 50;
  myButton.Caption := 'Dodaj';
  myButton.OnClick := myButtonClick;
  myButton.Parent := Form3;
  {Koniec dodawania wartosci komponentów}



  //Pokazanie formy
  Form3.Show;
end;
1

Yyy, nie wiem czy o to Ci chodzi, ponieważ jest to banalne rozwiązanie, więc pewnie nie o to. Ponieważ w wykonaniu tego nie ma żadnych problemów, czy robił byś to na kontrolkach na formatce czy też utworzonych dynamicznie poprzez kod.

//...
var
  LI : TListItem;
begin
  LI := TwojListView.Items.Add;
  LI.Caption := '1sza kolumna';
  LI.SubItems.Add(MyEdit.Text);
end;

Oczywiście MyEdit musi być albo zmienną składową klasy TForm1. Albo nadasz mu sensowne Name i użyjesz rzutowania z FindComponent. Albo jeśli Editów będzie wiecej to każdy będziesz trzymał w tablicy. Jednak oczywiście do tej zmiennej musisz mieć dostęp. Jeśli nie, to jak wspominałem - pozostaje FindComponent.

0

Chodziło mi o uworzenie eventu OnClick dla Form stworzonej dynamicznie ale obszedłem to innym rozwiazaniem, tworzac Forme globalnie jako class i mysle ze teraz juz bedzie łatwiej

2

Myślałem, że OnClick ma być dla jakiegoś przycisku. Ale czy dla przycisku czy dla formatki, to dodanie OnClick to żąden problem. Należy tylko sobie podpatrzeć jakie zdarzenia są tworzone dla statycznych OnClicków. Przykład pełnego kodu dla nowego modułu:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure FrmBtnOnClickProc(Sender : TObject);
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FrmBtnOnClickProc(Sender : TObject);
begin
  ShowMessage('Use TBrain :)');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Frm : TForm;
begin
  Frm := TForm.Create(Application);
  Frm.Caption := 'Test';
  Frm.Name := 'DynamicForm';
  Frm.Width := 300;
  Frm.Height := 300;
  Frm.Position := poScreenCenter;
  Frm.OnClick := FrmBtnOnClickProc;
  Frm.ShowModal;
end;

end.
0
procedure TForm3.myButtonClick(Sender: TObject);
var
LI : TListItem;
begin
  LI := Form2.ListView1.Selected;
  if LI <> nil then
  begin
    LI.SubItems[1] := myEdit.Text;
  end;
end;

Odnosząc sie w ten sposób do SubItems dostaje w wykonaniu "List Index out of bounds(1)"

0

Ech. Pytałeś mnie na PW, o zmiane drugiej kolumny najpewniej dla zaznaczonego elementu, więc podałem Tobie sposób z SubItems[0]. A Ty otrzymujesz błąd dla [1], który wszystko wyjaśnia.

Mie masz SubItema o indeksie 1, czyli trzeciej kolumny. Wtedy należy ją dodać poprzez LI.SubItems.Add. To według mnie jest całkiem logiczne. Możesz sobie jeszcze dorobić sprawdzanie if'em SubItems.Count. Tego już Tobie nie podawałem, bo założyłem, że skoro pytasz o podmianę wartości elemetów, to one istnieją.

0

Własnie chodzi o to że mam 3 kolumny i zarówno na SubItems[0] jak i SubItems[1] dostaje ten błąd tylko analogicznie do wartosci
"List Index out of bounds(0)"
"List Index out of bounds(1)"

Uświadomiłem sobie swój bład sprawdzając ilośc kolumn dla nadego wiersza za pomoca tego co napisałes SubItems.Count i wszystko działa jak w pierwotnym zalożeniu
Dzieki za pomoc :)

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