Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Neue Komponente mit 2 TEdit Komponenten (https://www.delphipraxis.net/134752-neue-komponente-mit-2-tedit-komponenten.html)

Optiplex 28. Mai 2009 14:19

Re: Neue Komponente mit 2 TEdit Komponenten
 
Hallo shmia,oki
Natürlich ist das eine Komponente die nur für ein spezielles Projekt ist, und auch nur dort verwendet wird. Die beiden Editfelder sich auch die einzigen Komponenten die auf der Komponente erstellt werden sollen. die Textausgaben werden im Paint der Komponente mit Outtext ausgegeben(deshalb TCostumControl).
Bis jetzt hat mir aber auch noch keiner gesagt wie man zwei Editfelder am besten erstellet, macht man das besser im Constructeur mit self oder nil oder verwendet man eine andere Procedure. Wie führt man die beiden OnChance Ereignisse zusammen in ein Ereignis wie auch immer sie heißen mag. Das sind die Probleme die mich zur Zeit am meisten beschäftigen und auf die ich gerne eine Antwort hätte.
Das mit den Frames ist für mich momentan nur Bömische Dörfer, da ich wie gesagt diese noch nie richtig benutzt habe.Von meiner Komponente benötige ich im eigentlichen Programm bis zu 120Stk geht das mit Frames überhaupt.

Hallo Satty67,
Natürlich vermisse ich die Quelltexte der Komponenten, da man dort doch sehr viel lernen kann.

oki 28. Mai 2009 14:19

Re: Neue Komponente mit 2 TEdit Komponenten
 
@shmia: Überzeugt :mrgreen:

Nur am Rande, ich hasse Frames. Hatte ich nur Ärger mit. Vielleicht hatte ich mich damit auch nur zu blöd angestellt. So ist das halt mit Vorurteilen.

Gruß oki

oki 28. Mai 2009 14:24

Re: Neue Komponente mit 2 TEdit Komponenten
 
grrr roter Kasten!

@optiplex:

Im Constructor mit Owner nil creieren, im CreateWnd Parent self zuweisen (natürlich für die enthaltenen Komponenten).

Das mit den Ereignissen erklär noch mal. Wies geht kann ich dir sagen, aber obs das ist, was du willst?

gruß

shmia 28. Mai 2009 14:30

Re: Neue Komponente mit 2 TEdit Komponenten
 
Zitat:

Zitat von oki
Nur am Rande, ich hasse Frames. Hatte ich nur Ärger mit.

Ähm, ja, das ist mir auch schon aufgefallen.
Niemals Frames ableiten; das funktioniert nicht richtig.
Unterhalb Delphi 5.02 sind Frames ebenfalls sehr zickig.
Und man muss immer mal wieder mit ALT-F12 kontrollieren, welche Properties des Frames in der DFM-Datei des Formulars überschrieben werden und diese ggf. von Hand löschen.
Wenn man das beachtet und es nicht übertreibt mit den Frames, dann kann man damit ganz gut leben.

Optiplex 28. Mai 2009 14:55

Re: Neue Komponente mit 2 TEdit Komponenten
 
Hallo Oki,
soll das heißen das ich eine Procedure CreateWnd überschreiben muss ? (dann bräuchte ich die genaue Syntax dieser Procedure) um dort die Eigenschaft Parent zuzuweisen. Ich dachte eigentlich dass die Eigenschaften immer im Constructeur zugewiesen werden.

Das mit Edit.Create(nil) im Constructeur habe ich verstanden. Aber warum Nil und nicht Self kannst du mir das erklären?

Das neue Ereignis soll folgendermaßen funktionieren, wird ein Editfeld verändert, soll dadurch das neue Ereignis ausgelöst werden. Ich muss praktische auf Änderungen in den Editfeldern reagieren können.

Ist es besser TEdit oder TCostumEdit zu verwenden?

Dieter

oki 28. Mai 2009 15:57

Re: Neue Komponente mit 2 TEdit Komponenten
 
Delphi-Quellcode:
TMyCustomControl = class(TCustomControl)
privat
  FEdit1 : TEdit;
  FEdit2 : TEdit;
  FOnEditChange : TNotifyEvent;
  ...
protected
  procedure CreateWnd; override;
  procedure EditChangeEvent(Sender : TObject);
published
  property OnEditChange : TNotifyEvent read FOnEditChange write FOnEditChange;
...

procedure TMyCustomControl.CreateWnd;
begin
  Edit1.Parent := self;
  Edit1.OnChange := EditChangeEvent;
  Edit2.Parent := self;
  Edit2.OnChange := EditChangeEvent;
  ...
end;
...
procedure TMyCustomControl.EditChangeEvent(Sender : TObject);
begin
  if Assigned(FOnEditChange) then
    FOnEditChange(Sender);
end;
Der Owner muss nil sein, weil sonst beim Speichern des Formulares in dem du deine neue Kompo verwendest deine Edits mit serialisiert werden (stehen dann in der dfm mit drin). Beim nächsten Laden wird dann ein Edit durch den Construktor erstellt und eins durch die IDE beim Lesen der dfm. Wieder speichern, sind beim nächsten mal schon 3 ....

Verpasse deiner Komponente ein eigenes Ereignis OnEditChange vom Typ TNotifyEvent. Dann so wie oben. Willst du nicht mit dem Sender arbeiten, so kannst du dir da auch eine eigene Ereignisprocedure anlegen und alles was so interessant ist mit hoch reichen.
Bsp.:
Delphi-Quellcode:
  TEditChangeTextEvent = procedure(Sender : TObject; EditText : String) of Object;
Das dann anstelle TNotifyEvent, die Ereignisproceduren anpassen, Text des sendenden Edit mit hochreichen etc.
Oder was immer du oben auch brauchst.

Gruß oki

Optiplex 29. Mai 2009 08:13

Re: Neue Komponente mit 2 TEdit Komponenten
 
Hallo Oki,
Vielen Dank für die Infos, ich muss also im Constructer die Edit-Felder Createn und in der CreateWnd die Eigenschaften setzen.
Ich gehe davon aus, dass ich die Edit-Felder im Destructor wieder freigeben muss.?
Da du FEdit1 : TEdit; im Code genommen hast nehme ich an,dass du TEdit und nicht TCustomEdit als Vorgänger bevorzugst oder hat dies einen besonderen Grund, dass du TEdit gemommen hast.
Muss ich sonst noch irgendwelche Besonderheiten beachten?
Ich werde am Wochenende mit dieser Komponente beginnen und hoffe, dass ich mit diesen Infos (die sehr gut sind, vor allem weil du sie erklären kannst) diese Komponente erstellen kann ohne allzuviele Fehlermeldungen.

Gruss Dieter,

oki 29. Mai 2009 08:39

Re: Neue Komponente mit 2 TEdit Komponenten
 
Hallo Optiplex,

ob die Edits von TCustomEdit oder TEdit kommen ist in diesem Fall egal. Du willst sie ja in deiner Komponente verwenden und nicht vererben. Da der Owner nil ist, werden sie ja nicht gestreamt. Somit sind die Published-Felder hier uninteressant.
Bei einer Vererbung eines Edits würde ich TCustomEdit verwenden, hier TEdit.

Und ja, im Destructor frei geben. Das ist besserer Stil. Normalerweise wird beim Beenden der Anwendung automatisch alles frei gegeben, aber sollte deine Componente zur Laufzeit frei gegeben werden, so bleibt eine Speicherleiche. Das automatische Freigeben übernimmt sonst der Owner, der ist hier aber nil.

Sonst noch beachten? Ja, da gibt es einiges, aber im Moment fällt mir konkret nichts bei deinem Ansatz auf. Ich würde mir nur ein ordentliches Handling für dein OnEditChange ausdenken. Da alle Edits das gleiche Ereignis benutzen sollen ist die Identifizierung im Programm recht umständlich, welches Edit nun gerade geändert wurde. Da ich nicht weis, was du vor hast kann ich hier schlecht raten. Auf jeden Fall würde ich nicht TNotifyEvent verwenden sonder eine eigene Ereignisprocedure erstellen. Enthalten sollte die mindestens:
- Sender -> das Panel
- Text -> neuer Text des betroffenen Edits
- EditItent -> Identifier des Edits, das betroffen ist (Name, Index oder sonst was)

Gruß oki

Optiplex 29. Mai 2009 12:01

Re: Neue Komponente mit 2 TEdit Komponenten
 
Danke Oki,
Hier mal ein paar nähere Infos zur Komponente.
Also das ganze gehört zu einem Turnierprogram und in dieser Komponente soll das Ergebnis einer Partie eingetragen werden, im Programm muss ich dann auf diese Eingabe reagieren können, um das Ergebnis auszuwerten(dafür soll das neue Ereignis sein).Die Textausgaben sind nur Texte Spielrunde Startnummern der beiden Spieler und deren Spielernamen sowie der Spielort. Ich habe mich entschlossen eine Komponente dafür zu entwickeln weil bei 16 Spielern in einem Doppel KO system schon 30 Partien notwendig sind und normalerweise wir 32 Spieler bzw 64 Spielern pro Turnier in der Vergangenheit hatten. Dann kannst du dir vorstellen wie viele Edits und Labels notwendig sind um eine Ergebnistabelle zu erstellen und gut aussehen soll das ganze auch noch da der Bildschirm auf eine Leinwand bzw großen LCD-Bildschirm gezeigt wird.
Das ist mein erstes größeres Projekt an den ich bestimmt noch einige Wochen arbeiten werde, da ich nur Hobbyprogrammierer bin, und nur in meiner Freizeit mich damit beschäftigen kann. Deshalb bin ich auch für jede Hilfe oder Tip dankbar.

Gruß
Dieter

oki 29. Mai 2009 12:09

Re: Neue Komponente mit 2 TEdit Komponenten
 
Joop, schönes Projekt.
Überleg dir erst mal, was die Edits melden sollen und was du im Programm von denen als Angaben brauchst um die Eingabe auswerten/verarbeiten zu können. Dann schreib dir dein Ereignis und implementiere das. Solltest du da nicht weiter kommen, helfe ich gerne. Aber erst mal musst du nachdenken. Was du im Programm von den Edits brauchst kann ich schwer sagen.

Gruß oki


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:43 Uhr.
Seite 2 von 5     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz