Delphi 2009: Heslo název komponenty onclick událost poté nastavte vlastnost

hlasů
1

Mám vlastní součást typu TSpeedButton, která má dvě další vlastnosti definované:

CommentHeading: string;
CommentText: string;

I nastavit CommentHeading v době návrhu.

Při stisknutí tlačítka rychlost poznámkový je zobrazen s tlačítko pod ním za záchranu jeho obsah. Postup, který zpracovává tento:

procedure CustomSpeedButton1Click(Sender: TObject);
begin
   Receiver := CustomSpeedButton1.Name; // possibly used to save the memo text back to this speedbuttons property after comments are submitted
   ViewComments(CustomSpeedButton1.CommentTitle,CustomSpeedButton1.CommentText);
end;

A postup ViewComments sám:

procedure ViewComments(comment_caption:string; comment_text:string);
begin
  label15.Hide; // label showing editing in progress, hidden until user begins typing
  Button1.Enabled     := false; // the button for saving the memo text, hidden until user begins typing
  CommentsBox.Visible := true; // pop up the comment box at the bottom of the form
  CommentsBox.Caption := 'Comments: ' + comment_caption;
  CommentsMemo.Text   := comment_text; // if there are existing comments assign them to memo
end;

Obsah této poznámky je třeba přiřazen vlastnosti CommentText z vlastní SpeedButton.

Co jsem původně myslel, že jsem mohl projít název komponenty na proměnnou když se stiskne zvyk SpeedButton a načíst toto jméno po stisku tlačítka uložit na poznámky a použít jej přiřadit text poznámky k speedbuttons CommentText majetku. Ale pak jsem si uvědomil, že k tomu budu muset použít nějaký prohlášení case..of který kontroluje pro každý možný název speedbutton a přiřadit hodnotu poznámky ke svým vlastnostem a to jen zdá neskutečně nudné.

Existuje jednodušší způsob, jak přiřadit text poznámky k speedbutton která otevřela poznámku na začátku?

Položena 27/08/2009 v 00:59
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
2

V konečném důsledku se ptáte, jak říct ViewCommentsfunkce, které vlastnosti tlačítka se to pracujete.

Chápete, co Senderparametr je na tom v OnClickakci? Je to vyprávění zpracování událostí, které se událost objektu jsou řešeny. Je to přesně podávat roli, kterou hledáte, aby na ViewCommentsfunkci.

To je to, co Mason byl stále na jeho odpověď. Spíše než projít všechny hodnoty vlastností, předat samotný objekt :

procedure ViewComments(CommentButton: TCustomSpeedButton);

Pak volat z události manipulátory Všechny vaše tlačítka:

procedure TForm1.CustomSpeedButton1Click(Sender: TObject);
begin
  ViewComments(CustomSpeedButton1);
end;

procedure TForm1.CustomSpeedButton2Click(Sender: TObject);
begin
  ViewComments(CustomSpeedButton2);
end;

Žádné struny, žádné caseprohlášení, žádné hledání.

To by mělo odpovědět na vaši otázku, ale můžete to udělat ještě lépe. Vzpomeňte si, co jsem řekl předtím o Senderparametr? Když někdo klikne na první tlačítko je Senderparametr této OnClickse psovoda je tlačítko, takže můžeme přepsat první rutiny události takto:

procedure TForm1.CustomSpeedButton1Click(Sender: TObject);
begin
  ViewComments(Sender as TCustomSpeedButton);
end;

A můžete přepsat druhou rutiny události takto:

procedure TForm1.CustomSpeedButton2Click(Sender: TObject);
begin
  ViewComments(Sender as TCustomSpeedButton);
end;

Hmm. Jsou to stejné. Mající dvě shodné funkce je nehospodárné, takže zbavit jednoho a přejmenujte druhá, takže to není tlačítko specifický zvuk:

procedure TForm1.CommentButtonClick(Sender: TObject);
begin
  ViewComments(Sender as TCustomSpeedButton);
end;

Pak nastavte OnClickvlastnosti obou tlačítek se odkazovat na tuto psovoda jedna událost. Můžete to udělat jen poklepáním vlastnost v Inspektoru objektů. Budete muset buď zadejte název sami, vyberte jej z rozevíracího seznamu, nebo přiřadit vlastnost události v době spuštění:

CustomSpeedButton1.OnClick := CommentButtonClick;
CustomSpeedButton2.OnClick := CommentButtonClick;

Také bych vás povzbudit, abyste používat smysluplné názvy ovládacích prvků. Že Label15je zvláště neslýchané. Jak můžete si uvědomit, že patnáctý štítek je ten, který naznačuje, že editace probíhá? Nazvěme to EditInProgressLabelnapř.

Odpovězeno 27/08/2009 v 07:24
zdroj uživatelem

hlasů
2

Vzhledem k tomu, že jste již prochází další proměnné kolem sebe, proč ne jen projít SpeedButton sám? Pak nebudete muset podívat do odkazu.

Odpovězeno 27/08/2009 v 01:16
zdroj uživatelem

hlasů
0

Malá změna kódu by mělo stačit:

procedure TForm1.CustomSpeedButton1Click(Sender: TObject);
var
  btn: TCustomSpeedButton;
begin
   btn := Sender as TCustomSpeedButton;
   Receiver := btn.Name; 
   ViewComments(btn.CommentTitle, btn.CommentText);
end;

a po úpravě komentář:

procedure TForm1.StoreComments(comment: string);
var
  btn: TCustomSpeedButton;
begin
  btn := FindComponent(Receiver) as TCustomSpeedButton;
  btn.CommentText := comment;
end;

Můžete také uložit do paměti tlačítko samotný namísto pouhého to jméno.

Odpovězeno 27/08/2009 v 07:22
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more