2009-08-26 4 views
1

ich eine benutzerdefinierte Komponente des Typs TSpeedButton haben, die zwei zusätzliche Eigenschaften definiert:Delphi 2009: Pass Komponentenname Onclick-Ereignis dann gesetzt Eigenschaft

CommentHeading: string; 
CommentText: string; 

ich bei Entwurfszeit festgelegt CommentHeading.

Wenn die Geschwindigkeitstaste gedrückt wird, wird ein Memo mit einer Taste darunter angezeigt, um den Inhalt zu speichern. Das Verfahren, das diese Griffe:

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; 

Und das ViewComments Verfahren selbst:

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; 

Der Inhalt des Memos müssen die Eigenschaft Comment des benutzerdefinierten Speedbutton zugewiesen werden.

Was ich zuerst dachte war, dass ich den Komponentennamen an eine Variable übergeben könnte, wenn der benutzerdefinierte SpeedButton gedrückt wird und dann diesen Namen abrufen, wenn die Schaltfläche zum Speichern auf dem Memo gedrückt wird und verwenden Sie es den Memotext zuweisen speedbuttons CommentText Eigenschaft. Aber dann erkannte ich, dass ich dafür eine Art von Fall verwenden müsste ... eine Anweisung, die nach jedem möglichen Speedbutton-Namen sucht und dann den Memo-Wert seinen Eigenschaften zuweist, und das erscheint nur lächerlich langwierig.

Gibt es eine einfachere Möglichkeit, den Memotext der Speedbutton zuzuordnen, mit der das Memo gestartet wurde?

Antwort

2

Letztendlich fragen Sie, wie Sie der ViewComments Funktion mitteilen, mit welchen Eigenschaften die Schaltfläche arbeitet.

Verstehen Sie, was der Sender-Parameter im Ereignis macht? Es teilt dem Ereignishandler mit, welches Ereignis des Objekts behandelt wird. Es dient genau der Rolle, die Sie nach der ViewComments Funktion bringen möchten.

Das ist, was Mason in seiner Antwort bekam. Anstatt alle Eigenschaftswerte passieren, passieren das Objekt selbst:

procedure ViewComments(CommentButton: TCustomSpeedButton); 

Dann nennen es von allen Tasten Event-Handler:

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

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

No strings, keine case Aussagen, keine Lookups.

Das sollte Ihre Frage beantworten, aber Sie können es noch besser machen. Denken Sie daran, was ich zuvor über den Parameter Sender gesagt habe?Wenn jemand auf die erste Schaltfläche klickt, werden die Sender Parameter dieser OnClick Handler die Schaltfläche sein, so können wir die ersten Event-Handler wie folgt umschreiben:

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

Und Sie können die zweiten Event-Handler wie folgt umschreiben:

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

Hmm. Sie sind gleich. zwei identische Funktionen haben, ist verschwenderisch, so einer loszuwerden und die andere umbenennen, damit es nicht klingt Taste spezifisch:

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

Dann stellen Sie die OnClick Eigenschaften von beiden Tasten zu diesem einen Event-Handler verweisen . Sie können dies nicht tun, indem Sie einfach im Objektinspektor auf die Eigenschaft doppelklicken. Verringern Sie entweder den Namen selbst eingeben, wählen Sie es aus der Dropdown-Liste, oder die Veranstaltung Eigenschaft zur Laufzeit zuweisen:

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

ich auch Sie ermutigen möchte mehr aussagekräftigen Namen zu verwenden, für Ihre Kontrollen. Das Label15 ist besonders ungeheuerlich. Wie können Sie sich daran erinnern, dass die fünfzehnte Beschriftung die ist, die angibt, dass die Bearbeitung gerade ausgeführt wird? Nennen Sie es zum Beispiel EditInProgressLabel.

+0

Rob, du bist ein Delphi GOTT !!! Das ist genau die Information, nach der ich gesucht habe! Und Mason, wenn du das liest, entschuldige ich mich dafür, dass ich nicht das erste Mal verstanden habe, was ich meine, aber ich habe Delphi erst im letzten Monat wieder aufgegriffen, nachdem ich seit 2002 weg war, also versuche ich immer noch an all das zu denken Konzepte, Tricks, etc. Rob, schätzen Sie Ihre Notiz über die Benennung der Etiketten - das bestimmte Etikett war nur ein schnell platzierter "Hack", um dem Benutzer zu zeigen, dass sie sich tatsächlich im Bearbeitungsmodus befanden. Vor der Kompilierung stelle ich die Labels immer entsprechend ihrer tatsächlichen Verwendung ein. – Rafe

2

Da Sie bereits zusätzliche Variablen übergeben, warum nicht einfach den SpeedButton selbst passieren? Dann müssen Sie die Referenz nicht nachschlagen.

+0

Das wirft immer noch die Frage auf, wie man den "Speichern" -Button sagt, welcher SpeedButton das Memo geöffnet hat, ohne einen case..of statement zu verwenden? Ich versuche, jede Art von großen Nachschlagen zu vermeiden, weil es hunderte dieser Kommentar-Schaltflächen auf dem Formular geben wird. – Rafe

+1

Ich verstehe nicht ganz, was das Problem ist. Ordnen Sie jedem Kommentar eine SpeedButton-Referenz zu. Wenn Sie einen Kommentar öffnen, geben Sie ihm einen Verweis auf die Schaltfläche, die ihn geöffnet hat. Dann, wenn Sie speichern, ist die Referenz, die Sie haben, die Schaltfläche, um sie wieder zuzuweisen. Keine Suchvorgänge erforderlich. –

0

Eine kleine Änderung an Ihren Code sollte es tun:

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

und nach dem Kommentar Bearbeitung: Name

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

Sie können auch die Schaltfläche selbst, anstatt nur es ist merken.

+0

Ich wollte nur hinzufügen, dass dies eigentlich der zweite Teil der Lösung ist! Es war Teil des Problems, die verschiedenen onclick-Ereignisse mit dem obigen Code von Rob zu trimmen, aber das Speichern der Kommentare war die andere Hälfte des Problems und mit ein wenig Fingerspitzengefühl macht dieser Code den Trick! Danke Uwe! – Rafe