Autor |
Beitrag |
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 19.10.10 15:47
Hi,
Wie der Titel schon sagt, überlege ich gerade ob man Buttons in eine Gaugecomponente einfügen kann?
Zusätzlichen Text (nicht den StandartCaption)und dessen Positionierung habe ich ja schon geschaft. Aber 1 oder 2 Buttons, incl ihrer Propertys und Eigenschaften?
Wüsste also nicht mal ansatzweise wie, wenn es überhaupt geht?
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 19.10.10 20:34
Ich weiß nicht, ob TGauge ein Handle hat, so dass du darüber den Parent des Buttons darauf setzen kannst.
Ansonsten: Schreibe doch einfach die komplette Gauge selbst. Viel ist das ja nicht, jedenfalls solange du nur einfache Formen haben möchtest (ich weiß nicht was TGauge so alles macht).
// EDIT:
Naja, also das was TGauge kann lässt sich recht schnell selber schreiben und dann kannst du einfach einen Button reintun.
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 19.10.10 21:26
jaenicke hat folgendes geschrieben : | ......und dann kannst du einfach einen Button reintun. |
Naja ich habe ja ne externe Komponente, abgeleitet von TGauge, wie ich da aber einfach nen Button reinbringen soll mit all seinen Möglichkeiten?
Es ist eine Unit die ich im Netz gefunden habe. Meine versuche schlagen da ja irgend wie fehl!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| unit GaugeCaption;
interface
uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, StdCtrls, Gauges, StrUtils;
type TTemperature= (tNormal, tDegradado, tTemperatura); TPosicion= (poIzquierda, poDerecha); TGaugeKind = (gkText, gkHorizontalBar, gkVerticalBar, gkPie, gkNeedle);
TGaugeCaption = class(TGauge) private
FMinValue: Longint; FMaxValue: Longint; FCurValue: Longint; FKind: TGaugeKind; FShowText: Boolean; FBorderStyle: TBorderStyle; FBorderWidth: TBorderWidth;
FButton1: TButton; FButton2: TButton; |
Hab noch nicht mal in irgend einer weise nen Ansatz dafür. Oder das geht vielleicht gar nicht und ich muss mir ne eigene schreiben, wo ich die beiden TGaugeCaption und TButton irgend wie zusammen bekomme!?
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 19.10.10 21:56
Die Eigenschaften sind im Button ja drin. Wenn du eine property unter published erstellst, steht die auch im Objektinspektor. Im Konstruktur müsstest du dann auch die Buttons mit erzeugen und auf die Komponente setzen.
Ich habe aber mittlerweile gesehen, dass ein TGauge gar kein Handle hat. Also kannst du da AFAIK auch keine Komponenten draufsetzen.
Deshalb denke ich einmal selber gleich alles machen geht am einfachsten.
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 19.10.10 22:08
jaenicke hat folgendes geschrieben : | Deshalb denke ich einmal selber gleich alles machen geht am einfachsten. |
Jo hab ich befürchtet  Nur wie bekomme ich beides zusammen?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| unit ButtonGauge;
interface
uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, StdCtrls, Gauges, StrUtils;
TButtonGauge = class(??????) | Wovon soll ich das nun ableiten? Da fehlt leider die Erfahrung
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Di 19.10.10 22:14
Moin,
TGraphicWinControl hat AFAIK ein Canvas, das könnte schonmal hilfreich sein. Ansonsten gibt es für sowas den Komponentenwizard!
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 19.10.10 22:50
mh... ne einzelne Komponente zu erstellen trau ich mir ja noch zu, aber ne Komponente die beides beinhaltet?
Dazu mal ein Bild im Anhang, wie ich es meine.
FinnO hat folgendes geschrieben : | Ansonsten gibt es für sowas den Komponentenwizard! |
jo, aber deswegen weiss ich nicht wie ich 2 unterschiedlich Komponenten in einer vereinen kann? Mir fehlt leider jeglicher Ansatz dafür!
Gruss Alf
Einloggen, um Attachments anzusehen!
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Di 19.10.10 23:07
Moin,
na ja, ich vermute mal, dass die Eigenschaften Top und Left eines Buttons sich auf sein parent beziehen. Und wenn du den Button dann als Property deiner Komponente hast und den im Constructor deiner Komponente das Handle ebendieser als Parent festlegst, könnte das etwas werden. Aber gemacht hab ich das auch noch nie, jaenicke hat da auch mit Sicherheit mehr Überblick.
LG
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Di 19.10.10 23:39
Du könntest von TCustomPanel ableiten...
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| TMyGauge = class(TCustomPanel) private .... protected procedure Paint(var Message: TWMPaint); Message WM_PAINT; .... |
hier im Contructor deine Buttons erzeugen, die Getter/Setter/Events durchschleifen
und im Paint malen
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mi 20.10.10 01:31
Naja, so richtig schnall ich das nicht wie ich eine 2te Komponente einbinden soll, unabhängig davon, ob ich es versuche in meiner TGaugeCaption zumachen, geschweige, wie ich es machen soll wenn ich 2 komponenten zusammen bringen soll. Bin einfach zu blöd.
Ich hab zwar versucht zu verstehen was Ihr mir geschrieben habt, aber ....
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 20.10.10 06:09
Ich schreib dir ne kleine Demo... Aber dazu komme ich erst nach der Arbeit heute Abend.
Wegen der Elternkomponente: Da du ein Fensterhandle brauchst um andere Komponenten mit SetParent auf deine Komponente zu pflanzen bietet es sich an von TCustomControl abzuleiten.
Von Nachfahren wie TCustomPanel abzuleiten ist weniger sinnvoll, da du deren Funktionalität wahrscheinlich gar nicht brauchst. Man sollte immer die höchste Komponente in der Hierarchie wählen, die alles hat was man braucht.
Und TGraphicControl ist für eigene Komponenten, die kein eigenes Fensterhandle brauchen.
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mi 20.10.10 10:22
Ich mach sowas immer anders. In etwa so:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| type TOnBtnClickEvent= procedure (GaugeMax, GaugeMin, GaugePos: integer) of object;
type TGaugeButton=class private Btn: TButton; Gauge: TGauge;
VOnBtnClick: TOnBtnClickEvent; VLeft: integer;
procedure SetLeft (v: integer);
procedure InternalOnBtnClick(Sender: TObject); public constructor Create( Owner: TWinControl); property Left: integer read VLeft write SetLeft; property OnBtnClick: TOnBtnClickEvent read VOnBtnClick write VOnBtnClick; end;
...
constructor TGaugeButton.Create (Owner: TWinControl); begin Gauge:=TGauge.Create(Owner); Gauge.Parent:=Owner;
Btn:=TButton.Create(Owner; Btn.Parent:=Owner; Btn.OnClick:=InternalOnBtnClick;
end;
procedure TGaugeButton.InternalOnBtnClick(Sender: TObject); begin if Assigned(OnBtnClick) then VOnBtnClick( Gauge.Min, Gauge.Max, Gauge.Pos); end;
procedure TGaugeButton.SetLeft (v: integer); begin Gauge.Left:=v; Btn.Left:=v+5; end; |
Zum verwenden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| GBtn: TGaugeButton; begin GBtn:= TGaugeButton.Create(Form1); GBtn.Left:=100; GBtn.OnBtnClick := OnGaugeBtnClick; end;
procedure TForm1.OnGaugeBtnClick(GaugeMax, GaugeMin, GaugePos: integer); begin ShowMessage('Gauge filled at '+floattostr( (GaugeMax-GaugeMin)/(GaugePos-GaugeMin)*100 )+'%'); end; |
Bin mehr ein Fan von Delegation anstatt von Vererbung.
Wenn du jetzt den Button direkt ansprechen willst, dann würde ich ihn public machen. Wenn du ihn dann von Hand verschiebst, bist du selbst Schuld 
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 20.10.10 11:39
Naja, aber ich denke mal die bessere Lösung ist schon eine eigene echte Komponente. Delegation ist schön und gut, aber auch nur dann, wenn es dazu passt. Aber hier...
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mi 20.10.10 16:47
Hi, es ist ja nicht so, das ich nun von euch erwarte das Ihr mir den code liefert
Bin natürlich selbst schon dabei was zu machen, geht aber halt langsam vorran. Mal sehen ob ichs packe!?
Achso, ich vergass zu erwähnen, das ich die Komponente die ich aus dem Inet habe einbinden möchte, also nicht die TGauge von Delhpi. Diese hat auch ein onClickereignis und noch ander dabei. So als Randbemerkung
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mi 20.10.10 22:02
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 20.10.10 22:04
Xion hat folgendes geschrieben : | Wie es aber ohne Delegation und ohne Mehrfachvererbung gehen soll ist mir ehrlich gesagt ein Rätsel |
Ich habe nicht gesagt ganz ohne Delegation.
Ja, ich mach mich gleich dran.
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mi 20.10.10 22:18
jo, ich hab nun auch schon was versucht, natürlich zwecklos. Hab zwar ne neue Komponente die keine Fehler mehr wirft, aber keine Buttons zu sehen. Klar, ohne Grundlage wie sowas funct kann es nur nach hinten losgehen
Edit:
Hab mal den Vorschlag von Xion umgesetzt. Ist ja toll  , währe jetzt nur schön, wenn ich die neue Komponente auch so auf die Form legen könnte. Aber ich code erst mal an das weiter
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 21.10.10 06:05
So, bin gestern eingeschlafen, habs aber gerade eben schnell gemacht, siehe Anhang.
Einloggen, um Attachments anzusehen!
Für diesen Beitrag haben gedankt: ALF
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Do 21.10.10 08:05
Wahrscheinlich wird die Info wie Clicks durchzuschleifen sind auch noch benötigt, einer der Wege liegt bei (davon ausgehend daß man onKlick intern auch was tun möchte):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| .... property Position: Integer read FPosition write SetPosition; Property OnButtonClick:TnotifyEvent read FButtonClick write FButtonClick; end;
TForm259 = class(TForm) TrackBar1: TTrackBar; procedure TrackBar1Change(Sender: TObject); procedure FormCreate(Sender: TObject); private FMyGauge: TMyGauge; public end;
var Form259: TForm259;
implementation
{$R *.dfm}
Procedure TMyGauge.InternalClick(Sender:TObject); begin if Assigned(FButtonClick) then FButtonClick(Sender); end;
constructor TMyGauge.Create(AOwner: TComponent); begin inherited; DoubleBuffered := True; FButton := TButton.Create(Self); FButton.OnClick := InternalClick; FButton.Left := 10; .... |
Für diesen Beitrag haben gedankt: ALF
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Do 21.10.10 19:38
Sorry, aber das überzeugt mich nicht
Das kann man weder von Hand auf der Form platzieren (ok, anderes Kapitel), noch kann ich den Button direkt ansprechen. Das einzige ist, dass du deine TGauge nochmals implementierst (im .Paint z.B.), was man ja aus OOP Sicht nun eben nicht braucht (ok, es sieht hübscher aus  ).
Was genau ist hier der Vorteil gegenüber meinem? Weil dass ich die Gauge nochmal programmieren muss, find ich deutlich als Nachteil. Nach diesem Schema müsste ich ja auch in allen meinen Klassen (Btn+Gauge, Edit+Gauge, Label+Gauge) immer die Gauge neu schreiben und abändern.
Was ich überhaupt *mist*e find ist, dass ich die ganzen Funktionen nach außen ziehen muss. Hmm, vielleicht wäre es am besten, die Klasse von TButton abzuleiten. Ja, ich glaub das wäre eine gute Idee bei der sogar ich Vererbung nutzen würde
...außerdem flackert der Button trotz DoubleBuffered:=True...komisch.
Edit:
Vererbung von TButton
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| type TGaugeBtn = class(TButton) private Gauge: TGauge; procedure SetPosition(V: integer); function GetPosition: integer; constructor Create( Owner: TWinControl ); destructor Destroy; public property Position: integer read GetPosition write SetPosition; end;
constructor TGaugeBtn.Create( Owner: TWinControl ); begin inherited Create(Owner);
Gauge:=TGauge.Create(Owner); Gauge.Left:=Self.Left; Gauge.Top:=Self.Top+Self.Height; Gauge.Width:=Self.Width; Gauge.Height:=Self.Height; Gauge.Parent:=Owner; end;
destructor TGaugeBtn.Destroy; begin Gauge.Free; Gauge:=nil;
inherited Destroy; end;
procedure TGaugeBtn.SetPosition(V: integer); begin Gauge.Progress:=V; end;
function TGaugeBtn.GetPosition:integer; begin Result:=Gauge.Progress; end; |
Edit:
Getestet und für gut befunden. Wie man das jetzt in den OI kriegt...vermutlich nicht so ohne weiteres (die Komponente muss sich dann irgendwo im Delphi registrieren).
Damit die Klasse gut funktioniert, muss man natürlich bei Left/Top... Veränderungen noch die entsprechenden Funktionen überschreiben um die Gauge mitzubewegen.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Zuletzt bearbeitet von Xion am Do 21.10.10 20:06, insgesamt 1-mal bearbeitet
|
|
|