![]() |
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:
Schon schlimm, daß da keiner draufgekommen ist. :shock: Aber mittlerweile ist ziemlich klar : "Keiner verwendet OOP" Oder zumindest fast keiner.
TRealEdit = class(TLabeledEdit)
Das ganze geht aber erst ab Delphi 6!! |
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). |
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 |
Hi Oki,
Zitat:
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. |
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 |
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. |
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:
Das wäre einmal das wichtigste, denn damit erscheint dein Label dann auch auf der Form.. der Rest bleibt dann erstmal dir überlassen.
type
{...} protected procedure SetParent(Value: TWinControl); override; {...} end; procedure TRealEdit.SetParent(Value: TWinControl); begin inherited; if fLabel.Parent <> Value then fLabel.Parent := Value; end; |
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 |
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal der erste Ansatz.
Gruß oki |
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 |
Variants ist seit Delphi 6 eine eigene Unit, die vorher woanders drin war. Frag mich nur nicht wo.
|
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: |
Hi,
Variants hab ich rausgeworfen. Ich bekomme immer noch eine Meldung SetSubComponent nicht gefunden. Gruß oki |
Hi,
man muß nur wissen wen man fragt. 8) Zitat:
Code:
Aber auch das hat keine Auswirkungen. Label ist nicht zu sehen, nur im ObjectTreeView.
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; |
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! ;) |
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:
ist das Label zwar da (hab ich geprüft), aber nicht zu sehen.
FLabel := TLabel.Create(self);
Schreibe ich
Delphi-Quellcode:
ist das Label auch zu sehen. Über Top und Left setze ich natürlich die Position.
FLabel := TLabel.Create(self);
FLabel.Parent := self; 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 |
Zitat:
|
ja ja Motzi,
ich hab doch nur laut nachgedacht. Ich bin Aber schon ein Stück weiter. Folgender Code:
Delphi-Quellcode:
So, nun kommt der Witz. Der Besitzer (Owner) des Labels ist das RealEdit! Somit ist self der richtige Parameter im Create!
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; 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 |
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!!! |
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! |
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Habe den Oki-Code so geändert (basierend auf meinem zuletzt geposteten):
Code:
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.
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; |
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 |
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:
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.
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. Es sollte also kein Problem sein das TRealEdit so zu erweitern.. |
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 |
Habt ihr ein Glück, daß ich nicht anfange einmal richtig zu motzen.
![]() 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ß. |
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!
|
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) |
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:
|
Zitat:
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: |
@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; |
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. |
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: |
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: |
Ein paar kleine Fehler...
Delphi-Quellcode:
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!
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;
Delphi-Quellcode:
Hier sollte man noch die Position des Labels aktualisieren...!
procedure TRealEdit.SetParent(AParent: TWinControl);
begin inherited SetParent(AParent); if FRealLabel = nil then exit; FRealLabel.Parent := AParent; FRealLabel.Visible := True; end; 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:
ist eine potenzielle Fehlerquelle!
fRealLabel :=value;
|
Zitat:
|
Zitat:
|
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 |
Zitat:
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. |
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 |
Zitat:
Zitat:
Zitat:
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. |
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