Autor Beitrag
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Di 19.10.10 21:26 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
......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!
ausblenden 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;

//---nun dachte ich an sowas-----//
         FButton1: TButton;
         FButton2: TButton;
//--- aber wie kann ich die Buttons in die Graphic einbinden bzw wie komm ich an die eigenschaften?---//

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Di 19.10.10 22:08 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Deshalb denke ich einmal selber gleich alles machen geht am einfachsten.
Jo hab ich befürchtet :( Nur wie bekomme ich beides zusammen?
ausblenden 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 :oops:

Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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.
gaugebutton
user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 19.10.10 23:39 
Du könntest von TCustomPanel ableiten...
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: Mi 20.10.10 10:22 
Ich mach sowas immer anders. In etwa so:

ausblenden volle Höhe 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:
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;

  //eventuell noch default positionen setzen
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:
ausblenden 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 :P

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Mi 20.10.10 16:47 
Hi, es ist ja nicht so, das ich nun von euch erwarte das Ihr mir den code liefert :wink:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: Mi 20.10.10 22:02 
user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
Hi, es ist ja nicht so, das ich nun von euch erwarte das Ihr mir den code liefert :wink:

Das hat ja auch keiner behauptet ;) Ich hab dir nur als Konzept gezeigt, wie ich sowas machen würde. Aber ich bin mal gespannt wie user profile iconjaenicke das vor hat, vielleicht find ich Vererbung dann doch endlich mal ganz nett :mrgreen: Wie es aber ohne Delegation und ohne Mehrfachvererbung gehen soll ist mir ehrlich gesagt ein Rätsel, aber ich bin ja lernfähig :D

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 20.10.10 22:04 
user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: 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 :? :cry:

Edit:
Hab mal den Vorschlag von user profile iconXion umgesetzt. Ist ja toll 8) , 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 :wink:

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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):
ausblenden volle Höhe 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:
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
    { Private declarations }
    FMyGauge: TMyGauge;
  public
    { Public declarations }
  end;

var
  Form259: TForm259;

implementation

{$R *.dfm}

{ TMyGauge }


Procedure TMyGauge.InternalClick(Sender:TObject);
begin
// hier gegf. interne Routinen
    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: 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 :mrgreen:

...außerdem flackert der Button trotz DoubleBuffered:=True...komisch.

Edit:
Vererbung von TButton

ausblenden volle Höhe 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:
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