Delphi-PRAXiS
Seite 2 von 3     12 3      

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 OOP-TRealEdit von TEdit abgeleitet und Fähigkeiten erweitert (https://www.delphipraxis.net/3975-oop-trealedit-von-tedit-abgeleitet-und-faehigkeiten-erweitert.html)

Hansa 16. Apr 2003 20:31

Tja, manchmal sieht man vor lauter Bäumen den Wald nicht mal. 8) Ändert mal nur folgende Zeile ziemlich am Anfang des letzten Quelltextes :

Code:
  TRealEdit = class(TLabeledEdit)
Schon schlimm, daß da keiner draufgekommen ist. :shock: Aber mittlerweile ist ziemlich klar : "Keiner verwendet OOP" Oder zumindest fast keiner.

Das ganze geht aber erst ab Delphi 6!!

Hansa 16. Apr 2003 22:45

Hi,

mir geht es hauptsächlich um DB-Komponenten (siehe Anfang). Wegen der großen Resonanz hier, mache ich einen neuen Thread auf, da in der Richtung "nicht - DB"-Komponenten für viele wohl kein Interesse besteht. Seit 9.4.2003 (also 1 Woche) : 458 Aufrufe, 40 Antworten (oder Gegenfragen) und davon ca.30 von mir. Also ca. 2% wirklich Interessierte (10 Antworten von 458 Aufrufen).

oki 17. Apr 2003 08:27

Hi Hansa,

leider muß ich mit dem TlebeledEdit passen, da ich kein D5 habe. Schade.
Deine letzte Einschätzung teile ich nicht.

Bei mir ist es so, dass meine Zeit leider sehr begrenzt ist (der Job frist mich auf). Da ist es manchmal schwer in so einem Thread mitzuwirken. Das Problem hier steckt in der anderen Art der Diskussion. So schaue ich durch ob ich schnell jemandem helfen kann wo ich sofort eine Antwort habe. Bei Threads wie diesem ist es eher so, dass ich die richtige Antwort in der Regel nicht parat habe, aber mir durchaus zutrauen mit erfolg mitzuwirken. Dazu muß ich aber auch im stillen Kämmerlein probieren. Das nimmt dann leider auch mal 1 bis 2 Tage in Anspruch. Nicht weil ich 48 Stunden rumprobiere, sondern weil ich dann so zwischendurch mal maximal 1 Stunde dafür abzweigen kann. So hänge ich leider zeitlich hinterher. Eine Antwort auf ein Problem eine Seite vorher willst Du aber nicht haben (siehe Tausender-Trennzeichen).

Naja, ich bleib trotzdem mal dran.

Gruß oki

Hansa 17. Apr 2003 09:52

Hi Oki,

Zitat:

Zitat von oki
leider muß ich mit dem TlebeledEdit passen, da ich kein D5 habe. Schade.

Dir gehts nicht alleine so, ich meine mit der Zeit. Mein Glück ist nur, daß ich sie einigermaßen einteilen kann, wie ich will. Aber bei dem TRealEdit gings doch mit darum, so etwas nachzubauen. Wäre das gelungen, hätten auch die nicht D6-Besitzer ein TLabeledEdit. Irgendwo vorher ist ein Screenshot, wie weit ich war. Das Label war im OI drinne, aber mit der Anzeige auf dem Bildschirm und sonstigen "Kleinigkeiten" kam ich nicht weiter. Und sonst wußte auch keiner was zu sagen. Ich warte mal ab, vielleicht kommt noch ein Hinweis.

Dann wurde noch die Frage nach einem Spineit gestellt, fällt mir gerade ein. Das müßte so ähnlich statt von TLabeledEdit oder TEdit von TSpinedit abgeleitet werden. Das Alignment müßte dann so wie bei dem TRealEdit eingebaut werden.

oki 17. Apr 2003 10:02

Hi Hansa,

erst mal hab ich mich vertippt. Ich arbeite natürlich mit D5 und hab kein D6.
Ich glaube aber du hast mich richtig verstanden.

Jetzt das was ich nicht verstanden habe.

Ich kenne kein TLabledEdit und weiß somit nicht wie das aussehen soll. Sag mal kurz wo das Label beim Edit erscheinen und was das anzeigen soll.


Gruß oki

Hansa 17. Apr 2003 10:11

Hi,

also das Label "klebt" an dem TEdit. Das ist mal das wichtigste, dann kann man noch einstellen wo es sich befindet (Above, Left,...) und mit LabelSpacing den Abstand zwischen Label und Edit. Ansonsten ist es wie ein normales Label.

Motzi 17. Apr 2003 10:18

So.. ich meld mich auch nochmal zu Wort. Ich hab dir doch gestern im ICQ gesagt du sollst die Methode SetParent überschreiben, aber vielleicht hast du den Wink nicht ganz verstanden.

Dein Label vom LabelEdit braucht einen Parent - ganz klar, den braucht jedes Control, das irgendwo angezeigt werden soll! Der Erste Vorschlag war daher Label.Parent := TWinControl(AOwner). Dieser Vorschlag ist nicht nur unelegant und gefährlich (Owner <> Parent) sonder auch noch unflexibel. Wenn der Parent des Edits zur Laufzeit geändert wird kann der Parent des Labels nicht angepasst werden.

Ich hab mir gestern mal die Deklaration von TControl angeschaut (die Eigenschaft Parent wird mit dem TControl eingeführt). Die Methode SetParent ist als protected und virtual deklariert und kann daher in abgeleiteten Klassen überschrieben werden (dieser Weg wird auch beim "original" LabeledEdit eingeschlagen)! Des Rätsels Lösung ist also in deinem Code einfach folgende procedure einzufügen (das ist jetzt nur aus dem Kopf, also keine Garantie!):

Delphi-Quellcode:
type
  {...}
  protected
    procedure SetParent(Value: TWinControl); override;
  {...}
end;

procedure TRealEdit.SetParent(Value: TWinControl);
begin
  inherited;
  if fLabel.Parent <> Value then
    fLabel.Parent := Value;
end;
Das wäre einmal das wichtigste, denn damit erscheint dein Label dann auch auf der Form.. der Rest bleibt dann erstmal dir überlassen.

oki 17. Apr 2003 10:21

Hi,

ich denke erst mal muß das Allignment des Labels als Eigenschaft in die Kompo.

Dann muß beim Create Top und Left, sowie High und Wight des Labels in Abhängigkeit der entsprechenden Werte des Edits und des Alingnments des Labels gesetzt werden.

Dann müßte nach meiner Meinung nur noch die Änderung der Werte beim Edit automatisch für das Label neu gerechnet werden.

Ich mach mich mal an den Code ran.

Gruß oki

oki 17. Apr 2003 10:25

Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal der erste Ansatz.

Gruß oki

oki 17. Apr 2003 10:29

Hi Hansa,

noch ein kleines Problem. Ich habe keine dcu Variants.

Was ist das? Vielleicht kannst du mir die mal eben rübergeben.

Gruß oki

Hansa 17. Apr 2003 11:24

Variants ist seit Delphi 6 eine eigene Unit, die vorher woanders drin war. Frag mich nur nicht wo.

Daniel B 17. Apr 2003 11:40

Hallo,

Du kannst die Variants normal raus werfen, auch bei allen anderen Projekten mache ich sie immer überall raus, weil nie gebraucht wird.

Grüsse, Daniel :hi:

oki 17. Apr 2003 12:04

Hi,

Variants hab ich rausgeworfen.

Ich bekomme immer noch eine Meldung SetSubComponent nicht gefunden.

Gruß oki

Hansa 17. Apr 2003 12:19

Hi,

man muß nur wissen wen man fragt. 8)

Zitat:

Hi Hansa
Also in D5 waren die ganzen Variant Geschichten in SYSTEM deklariert. Die Umstellung von D5 auf D6 klappt dabei problemlos, ob's umgekehrt genauso ist kann ich dir nicht sagen. Aber einfach mal ausprobieren.
Das SetSubComponent habe ich auskommentiert. Keine Auswirkung. Dann habe ich das SetParent wie von Motzi gesagt in den Quelltext geschrieben. Die Deklaration sieht nun so aus:

Code:
type
  TRealEdit = class(TCustomEdit)
  private
    fAlignment:TAlignment;
    fOnlyReals:boolean;
    fLabel:TLabel;
    procedure SetAlignment(Value:TAlignment);
    procedure SetOnlyReals(Value:boolean);
    procedure SetLabelPos;
  protected
    procedure SetParent(Value:TWinControl);
    procedure SetLabel(Value:TLabel);
    procedure CreateParams(var Params:TCreateParams); override;
    procedure KeyPress(var Key:Char); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor destroy; override;
  published
    property Alignment: TAlignment read fAlignment write SetAlignment;
    property OnlyReals: Boolean read fOnlyReals write SetOnlyReals;
    property RealLabel: TLabel read fLabel write SetLabel;
  end;
Aber auch das hat keine Auswirkungen. Label ist nicht zu sehen, nur im ObjectTreeView.

Motzi 17. Apr 2003 13:27

mir geht bei deiner Deklaration von SetParent das "override" ab...! :roll:

OK, jetzt hast du mich soweit! :mrgreen: Sobald ich zuhause bin setz ich mich hin und probier das mal aus! Das kanns doch nicht sein, dass das nicht hinhaut! ;)

oki 17. Apr 2003 17:01

Hi Leute,

jetzt mal was zum grübeln.

Wenn etwas nicht mehr so will wie es soll, dann mach ich es erst mal ganzzzzzzzz einfach.

Ich hab auf einem Formular einen Button platziert und wenn mal auf diesen clickt wird ein Label zur Laufzeit erstellt. Jetzt passiert folgendes:

wenn ich nur schreibe

Delphi-Quellcode:
  FLabel := TLabel.Create(self);
ist das Label zwar da (hab ich geprüft), aber nicht zu sehen.

Schreibe ich

Delphi-Quellcode:
  FLabel := TLabel.Create(self);
  FLabel.Parent := self;
ist das Label auch zu sehen. Über Top und Left setze ich natürlich die Position.

Also ist mal eins klar, Parent muß zwingend gesetzt werden und erfolgt nicht automatisch im Create über Owner.
Parent ist demzufolge das Element auf dem sich das Label befindet und zu dessen Client-Bereich Top und Left in Beziehung steht.

Mit dem ganzen Kram bin ich mir jetzt recht sicher.

Die Frage ist jetzt, was ist nun Owner im Create des TRealEdit und ist der Owner identisch mit dem Parent?

Ich denke mal nicht! Es muß wohl bei Setzen des Parent des Labels nicht der Owner des RealEdit sondern der Parent verwendet werden.

Ich teste mal weiter.

Gruß oki

Motzi 17. Apr 2003 18:18

Zitat:

Zitat von oki
Also ist mal eins klar, Parent muß zwingend gesetzt werden und erfolgt nicht automatisch im Create über Owner.
Parent ist demzufolge das Element auf dem sich das Label befindet und zu dessen Client-Bereich Top und Left in Beziehung steht.

Genau das versuch ich doch die ganze Zeit zu sagen...! :roll:

oki 17. Apr 2003 18:39

ja ja Motzi,

ich hab doch nur laut nachgedacht.

Ich bin Aber schon ein Stück weiter. Folgender Code:

Delphi-Quellcode:
constructor TRealEdit.Create(AOwner: TComponent);
begin
  inherited;
  FAlignment := taRightJustify;
  OnlyReals := true;
  FLabel := TLabel.Create(self);
  FLabel.Parent := TWincontrol(AOwner);
  FLabel.Name := 'RealLabel';
//  FLabel.SetSubComponent(true);
  FLabel.Caption := 'CAPTION';
  // Position des Lables setzen
  SetLabelPos;
end;
So, nun kommt der Witz. Der Besitzer (Owner) des Labels ist das RealEdit! Somit ist self der richtige Parameter im Create!

Als Parent wird der Besitzer des RealEdit verwendet, denn in diesem wird das RealEdit dargestellt. Dort soll ja auch das Label hin. Die Typkonvertierung ist nun nicht sehr elegant, da fällt euch bestimmt was zu ein.


Ich hab die ganze sache mal ausprobiert. Die hat nur einen Schönheitsfehler, das Label erscheint zur Laufzeit, aber nicht zur Designzeit. Naja, wird noch.

Die Methode SetLabelPos steht unter privat und setzt Top und Left des Labels in Abhängigkeit von Top und Left des RealEdits. Da muß man dann auch noch weitermachen.


Gruß oki

Hansa 17. Apr 2003 18:40

Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

wie sagt Motzi : "Monsterthread", ja schon recht groß *grusel*

hier hängt noch eine Version dran, bei der sich die maximale Anzahl an Nachkommastellen im OI einstellen läßt. Vorgabewert ist dabei 2. Das Label geht noch nicht!!!

mirage228 17. Apr 2003 18:45

mir ist da ein kleiner fehler aufgefallen:

wenn ich "Alignment" ändere, wird das Alignment der Komponente zwar geändert (ich kanns sehen), aber im OI steht immer noch taRightAlignment!

Hansa 17. Apr 2003 19:13

Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von mirage228
...aber im OI steht immer noch taRightAlignment!

Da hat er Recht ! Nur wieso ist das so ?

Habe den Oki-Code so geändert (basierend auf meinem zuletzt geposteten):

Code:
constructor TRealEdit.Create(AOwner: TComponent);
begin
  inherited;
  FAlignment := taRightJustify;
  OnlyReals := true;
  FRealLabel := TLabel.Create(self);
  FRealLabel.Parent := TWincontrol(self{AOwner}); // ******************
  FRealLabel.Name := 'RealLabel';
//  FLabel.SetSubComponent(true);
  FRealLabel.Caption := 'CAPTION';
  // Position des Lables setzen
  SetLabelPos;
end;
Da kommt das im Anhang raus. Würde das Caption jetzt noch vor dem Real Edit und nicht innerhalb stehen, wärs das wohl gewesen. Und dann noch das von Mirage.

oki 17. Apr 2003 19:14

Liste der Anhänge anzeigen (Anzahl: 1)
Hi Hansa,

hier dein label!

die Berechnung der Position für die Ausrichtung ist noch Pfusch, aber ich wollte schon mal schnell den Ansatz posten.

Paß auf, ich hab die Unit nicht umbenannt und dein letztes Update noch nicht übernommen!!! :witch:

Gruß oki

Motzi 17. Apr 2003 19:20

Folgender Code hängt in keiner Weise mit irgendeinem bisher in diesem Thread geposteten Code zusammen sondern wurde gerade von mir erstellt (ich hab mich ein bisschen am "original" TLabeledEdit orientiert):

Delphi-Quellcode:
unit LabeledDBEdit;

interface

uses
  DBCtrls, StdCtrls, Classes, Controls;

type
  TLabeledDBEdit = class(TDBEdit)
    private
      FLabel: TLabel;
    protected
      procedure SetParent(Value: TWinControl); override;
    public
      procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
      constructor Create(AOwner: TComponent); override;
      destructor Destroy; override;
  end;

  procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Test', [TLabeledDBEdit]);
end;

constructor TLabeledDBEdit.Create(AOwner: TComponent);
begin
  inherited;
  FLabel := TLabel.Create(Self);
  FLabel.Caption := 'LabelCaption';
end;

destructor TLabeledDBEdit.Destroy;
begin
  FLabel.Free;
  FLabel := nil;
  inherited;
end;

procedure TLabeledDBEdit.SetParent(Value: TWinControl);
begin
  inherited;
  if Assigned(FLabel) then
  begin
    FLabel.Parent := Value;
    FLabel.Top := Top - FLabel.Height - 1;
    FLabel.Left := Left;
    FLabel.Visible := True;
  end;
end;

procedure TLabeledDBEdit.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
  inherited;
  if Assigned(FLabel) then
  begin
    FLabel.Top := Top - FLabel.Height - 1;
    FLabel.Left := Left;
  end;
end;

end.
Ich hab die Kompo nicht ausführlich getestet, aber es funktioniert soweit alles. Das Label wird sowohl zur Design-Time als auch RunTime richtig angezeigt.

Es sollte also kein Problem sein das TRealEdit so zu erweitern..

oki 17. Apr 2003 19:43

Also, mein letzter Beitrag für heute.

Das ist echt gemein von dir motzi. Ich hab kein D6 und kein TLabledEdit und quäl mir einen ab.

Dann kommst du mit code der a: besser aussieht, b: kürzer ist und c: behauptest so lapidar das müßte so eben locker funzen.

Wie steh ich jetzt da!

Na gut. Da währe aber noch was. Es währe doch gut, wenn wir das Label in den OI mit seinen Eigenschaften bekommen. Warum auf alles verzichten?

Gruß oki

Hansa 17. Apr 2003 20:17

Habt ihr ein Glück, daß ich nicht anfange einmal richtig zu motzen.
http://www.lcschuhmann.de/hornet/meckersmilie.gif

Oki hat es wirklich nicht leicht mit D5. Ein Konzept wie dieses wurde meines Wissens nach erst mit Delphi 6 eingeführt. Fertig ist die Komponente sowieso noch nicht. 1. Der von Mirage??? gepostete Fehler ist noch drin 2. Die LabelPosition ist nicht im OI enthalten.

Eventuell poste ich zu später Stunde noch eine Zusammenfassung, damit nicht jeder diesen "Monsterthread" von Anfang an lesen muß.

Hansa 18. Apr 2003 01:00

Liste der Anhänge anzeigen (Anzahl: 1)
So, hier ist jetzt die neueste Version. Ein Label ist vorhanden, die Labelposition kann eingestellt werden und für heute (gestern) wars das dann. Der Rest bleibt noch offen. Und das LabelSpacing (Abstand Label - Eingabefeld) fehlt noch. Desweiteren sind die Postionen des labels nur testweise fertig. Und dann halt noch der "Mirage"-Effekt. :mrgreen: Und was neu ist, ist nicht getestet!

mirage228 18. Apr 2003 08:04

Der Effekt wurde nach mir benannant :) ich fühle mich geehrt :mrgreen:

Leider funzt die neue Version net bei mir, hab nur Delphi 3 Professional und da gibts ja dieses neue Label nicht (gibts glaub ich erst ab D6)

Hansa 18. Apr 2003 10:45

Hi Mirage, 8)

gut, der Thread ist schon lang, da will ich keinem zumuten das genau von Anfang an zu lesen. Dann muß ich Dich aufklären. :lol:

Komponente TLabeledRealEdit

ersetzt das TLabelEdit von Delphi 6 und bietet folgende erweiterte Möglichkeiten (alles im Objekt-Inspektor) :

- Feld "OnlyReals" : Ist das auf true gesetzt werden nur Zahlen und ein DecimalSeparator akzeptiert. Es kann auch auf false stehen, dann wird alles akzeptiert

- Feld "Alignment" : In das Editfeld kann links/rechtsbündig oder zentriert etwas eingegeben werden

- Feld "MaxNachKomma" : die Anzahl der möglichen Nachkommastellen kann festgelegt werden

- Feld "Labelpos" : die Position des Labels in Bezug auf das Eingabefeld. Mögliche Werte : lpAbove,lPRight,lpLeft,lpBelow

Fehler / was noch fehlt:

1. Das Alignment wirkt sich zur Laufzeit nicht aus (immer rechtsbündig)
2. Ist OnlyReals true, kann durch die "Hintertür" Zwischenablage trotzdem ein nicht zulässiger Wert in das Feld gelangen
3. die Labelpositionen sind noch nicht fertig
4. das LabelSpacing (Abstand Label<->Edit) fehlt noch

@Mirage: was soll das da heißen:

Zitat:

...und da gibts ja dieses neue Label nicht (gibts glaub ich erst ab D6)
Du meinst das LabeledEdit :?: Das gibts erst ab D6, aber deshalb ist das hier ja gut. Was geht denn da nicht.

mirage228 18. Apr 2003 10:54

Zitat:

Zitat von Hansa
@Mirage: was soll das da heißen:

Zitat:

...und da gibts ja dieses neue Label nicht (gibts glaub ich erst ab D6)
Du meinst das LabeledEdit :?: Das gibts erst ab D6, aber deshalb ist das hier ja gut. Was geht denn da nicht.

Also bei meinem Delphi 3 gibts diese Komponente da nicht und dann findet der wohl irgendwelche vererbten Eigenschaften nicht denke ich.
Bei mir meinte der z.b. "Undefinierter Bezeichner: TLabelpos {oder was da auch stand}"

Den Thread selbst hab ich so schnipselweise gelesen ;-) ganz unwissend bin ich also doch nicht :mrgreen:

Hansa 18. Apr 2003 11:01

@Mirage : "Dein"-Effekt gibts nicht mehr. Pech gehabt. :mrgreen: Das lpAbove wurde vielleicht im Zusammenhang des TLabeledEdit eingeführt. Dann schreib Dir das doch selber :

TLabelPosition = (lpAbove,...);

in der auskommentierten Zeile war das fAlignment einmak zu viel drin.

Code:
procedure TRealEdit.CreateParams(var Params: TCreateParams);
const Alignments: array[TAlignment] of byte=(ES_Left, ES_Right, ES_Center);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style or Alignments[fAlignment];
//  fAlignMent := taRightJustify;
end;

Hansa 18. Apr 2003 12:22

Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

das hier ist jetzt die fertige Version. Nur die Frage der Zwischenablage ist noch offen. Darüber dürfte man aber einiges finden. Wenn jemand das sowieso weiß, wie solche Fehler abzufangen sind, dann her damit.

Bei 700 Aufrufen hat das Thema anscheinend schon Interesse geweckt, aber die Anzahl der Downloads (1-2) 8) zeigen wohl, daß viele sich nicht einmal mit fertigem Quelltext ernsthaft um OOP kümmern wollen. Vielleicht schreckt die Länge des Threads mittlerweile auch einige ab. Da es noch Probleme mit LabelSpacing, den Zeichenkoordinaten usw. gab, habe ich um nicht noch eine Woche an dem Thema zu hängen kurzerhand entschlossen einige Sachen von dem Borland-TLabelEdit zu übernehmen. Dies bedeutet für nicht D6-Benutzer wahrscheinlich nichts gutes. Z.B. ist nicht mehr abgeleitet von TEdit, sondern von TBoundEdit. Es betrifft um die 3-4 Prozeduren. Falls es sich nicht compilieren läßt empfehle ich die Version davor zu benutzen und den Alignment Fehler zu korrigieren. LabelPosition und LabelSpacing dürften wohl nicht sooo wichtig sein. Bzw. sind sie leicht abzuändern. Vorsichtshalber habe ich die Unit mal anders genannt.

Und noch eine Bitte: Sollte irgendwann jemand auf die Idee kommen, das ganze tatsächlich so in seinen Programmen zu verwenden, dann bitte kurze PN. Würde mich schon mal interessieren.

Motzi 18. Apr 2003 12:40

Liste der Anhänge anzeigen (Anzahl: 1)
So, hab mir jetzt auch mal den Source runtergeladen...

Hab mir das Ding mal angeschaut und ein paar Änderungen vorgenommen. Da ich aber so wie immer an meinem Zivi-Arbeitsplatz sitz und daher wie immer kein Delphi hab ;) sind die Änderungen alle aus dem Kopf und natürlich nicht getestet! :mrgreen:

BTW: hab das ganze außerdem ein bisschen an meinen Stil angepasst! :roll: :mrgreen:

Motzi 18. Apr 2003 12:49

Während ich den Code überarbeitet hab hat da anscheinend noch jemand was dazwischen gepostet! :mrgreen:

@Hansa: schau dir mal meinen Code an und ich schau mir daweil mal deinen neuen an! :spin: :bouncing4:

Motzi 18. Apr 2003 13:04

Ein paar kleine Fehler...
Delphi-Quellcode:
procedure TRealEdit.CreateParams(var Params: TCreateParams);
const Alignments: array[TAlignment] of byte=(ES_Left, ES_Right, ES_Center);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style or Alignments[fAlignment];
end;
Die Zuweisung von Params.Style muss natürlich VOR dem Aufruf von inherited erfolgen, damit der neue Stil im neuen Fenster auch wirklich vorhanden ist!

Delphi-Quellcode:
procedure TRealEdit.SetParent(AParent: TWinControl);
begin
  inherited SetParent(AParent);
  if FRealLabel = nil then exit;
  FRealLabel.Parent := AParent;
  FRealLabel.Visible := True;
end;
Hier sollte man noch die Position des Labels aktualisieren...!

Und außerdem muss man nicht jedesmal, wenn ein property geändert wird RecreateWnd aufrufen! ;) RecreateWnd wir benötigt wenn ein Property geändert wird, dass ein elementarer Bestandteil eines Windows-Steuerelements ist, der zur Laufzeit nicht geändert werden kann wie zB der Fensterstil für die Ausrichtung. Wird die Ausrichtung geändert, dann muss das gesamte Fenster neu erstellt werden (-> neues Handle). Bei normalen Properties wie LabelSpacing, LabelPos, .. kann man sich das sparen.

Außerdem würd ich das Property RealLabel ReadOnly machen! Eine Set-Methode für das Label mit einer einfachen Zuweisung:
Delphi-Quellcode:
fRealLabel :=value;
ist eine potenzielle Fehlerquelle!

[TP]Hawk274 18. Apr 2003 16:21

Zitat:

Außerdem würd ich das Property RealLabel ReadOnly machen! Eine Set-Methode für das Label mit einer einfachen Zuweisung:
Code:
fRealLabel :=value;
ist eine potenzielle Fehlerquelle!
Kannst du das bitte mal näher erläutern? Mit einem Beispiel würde ich das in diesem Fall besser verstehen. Danke ...

Motzi 18. Apr 2003 20:59

Zitat:

Zitat von [TP
Hawk274]
Zitat:

Außerdem würd ich das Property RealLabel ReadOnly machen! Eine Set-Methode für das Label mit einer einfachen Zuweisung:
Code:
fRealLabel :=value;
ist eine potenzielle Fehlerquelle!
Kannst du das bitte mal näher erläutern? Mit einem Beispiel würde ich das in diesem Fall besser verstehen. Danke ...

Objekte sind in Delphi nur Pointer die implizit dereferenziert werden (klingt komplizierter als es ist). Durch die Anweisung fRealLabel := Value wird also nicht das Objekt sondern einfach nur eine Referenz kopiert. Einerseits verliert man damit die Referenz auf das Original-Objekt, das fRealLabel ursprünglich referenziert hat, und hat damit keine Möglichkeit mehr darauf zuzugreifen und es freizugeben (-> Speicherleck), und andrerseits erhält man eine Referenz auf ein Objekt, auf das höchstwahrscheinlich auch noch eine andere Referenz existiert. Wird dieses Objekt nun freigegeben und die TRealLabeledEdit-Komponente versucht auf "sein" Label zuzugreifen, dann wird damit ein EAccessViolent ausgelöst da das Objekt ja nicht mehr existiert.

oki 22. Apr 2003 08:24

Liste der Anhänge anzeigen (Anzahl: 1)
Hi Leute,

ich hab nur ein bischen was gemacht und eure Änderungen noch nicht eingearbeitet. Aber das Thema Abstand Label - RealEdit ist bei mir mit drin. Gleichzeitig habe ich ein Property für die Ausrichtung des Labels zum RealEdit eingefügt. Vielleicht ist das interessant.

Man sollte aber noch mal prüfen, ob man das Label nicht mit seinen Property in den OI bekommt. Es gibt ja doch einige Eigenschaften die nützlich sind.

Gruß Oki

Motzi 22. Apr 2003 08:57

Zitat:

Zitat von oki
Hi Leute,

ich hab nur ein bischen was gemacht und eure Änderungen noch nicht eingearbeitet. Aber das Thema Abstand Label - RealEdit ist bei mir mit drin. Gleichzeitig habe ich ein Property für die Ausrichtung des Labels zum RealEdit eingefügt. Vielleicht ist das interessant.

Man sollte aber noch mal prüfen, ob man das Label nicht mit seinen Property in den OI bekommt. Es gibt ja doch einige Eigenschaften die nützlich sind.

Gruß Oki

Das mit dem Label im OI werd ich mir mal anschaun.. vielleicht geht das sogar (schlimmstenfalls braucht man halt ein Wrapper-Objekt).

Ansonsten würd ich sagen, das Hansa du und ich uns mal auf einen Source einigen und uns "synchronisieren", damit nicht jeder immer nur an seinem eigenen Code arbeitet.

oki 22. Apr 2003 10:07

Hi Motzi,

das mit dem "syncronisieren" ist eine tolle Idee, auch dass du das übernehmen willst (ich hätte dafür auf Anhieb keine Idee).

Zum Thema Wrapper-Object bin ich gespannt. Auf dem Gebiet bin ich richtig blaß.

Schau Dir mal meinen Code an. Ich hab die Thematik "Pos setzen" in eine eigene Methode ausgelagert. Ich halte das für sinnvoll. Hier ist doch die Möglichkeit recht übersichtlich auf alle Eigenschaften zur Positionierung des Labels zu reagieren und in den notwendigerweise überschriebenen Methoden des TEdit wird es übersichtlicher.

Gruß oki

Motzi 24. Apr 2003 10:56

Zitat:

Zitat von oki
Hi Motzi,

das mit dem "syncronisieren" ist eine tolle Idee, auch dass du das übernehmen willst (ich hätte dafür auf Anhieb keine Idee).

Mal schaun wie wir das am blödesten äh.. besten machn. ;)

Zitat:

Schau Dir mal meinen Code an. Ich hab die Thematik "Pos setzen" in eine eigene Methode ausgelagert. Ich halte das für sinnvoll. Hier ist doch die Möglichkeit recht übersichtlich auf alle Eigenschaften zur Positionierung des Labels zu reagieren und in den notwendigerweise überschriebenen Methoden des TEdit wird es übersichtlicher.
Ja, find ich auch sinnvoll! ;)

Zitat:

Zum Thema Wrapper-Object bin ich gespannt. Auf dem Gebiet bin ich richtig blaß.
Jo.. ich hab mich mal gestern drangemacht. Folgendes Prinzip: es gibt ja die Möglichkeit im OI "Unteroptionen" (die mit diesem "+" dahinter) einzutragen. Siehe zB TFont - wenn man da auf das "+" klickt klappen die "unteroptionen" auf. Vorsicht, nicht verwechseln mit den Enumerations-Typen! Die haben zwar auch ein "+" allerdings enthält die aufklappbare Liste nur Boolean-Werte die angeben ob ein bestimmtes Element in der Menge enthalten ist oder nicht.
Solche "Unteroptionen" implementiert man indem man eine neue Klasse von TPersistent ableitet und ein Objekt der neuen Klasse im published Teil seiner Komponente deklariert. TLabel hat in seiner Klassen-Hirachie TPersisten drinnen, dh wenn man das Label im published Teil deklariert hat man auch alle Eigenschaften des Labels als "Unteroptionen" im OI. Allerdings ist das nicht wirklich sinnvoll, dann man dann zB auf Eigenschaften wie Left und Top Zugriff hat die ja eigentlich vom Edit gesetzt/gesteuert werden sollen. Daher meine Überlegung:

Ich leite eine neue Klasse TLabelOptions von TPersistens ab und führe jene Properties des Labels ein auf die man zugreifen können soll. Für jedes Property meiner TLabelOptions-Klasse implementiert man dann eine read (Get-) bzw write (Set-) Methode die intern nichts andres macht als auf die Eigenschaften des Labels zurückzugreifen. Das Label selbst würde ich dann nur mehr als privates Objekt-Feld deklarieren, damit von außen gar kein direkter Zugriff mehr erfolgen kann. (ist ja auch nicht nötig, wenn man alle wichtigen Eigenschaften über das TLabelOptions-Objekt ändern kann).

Das warst erstmal. Ich meld mich heute/morgen wieder wenn ich fertig bin (hab BTW auch den rest des Codes ein bisschen überarbeitet).

So long... :coder: :bounce1:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:19 Uhr.
Seite 2 von 3     12 3      

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