![]() |
Schalter Programm, Hilfe gesucht!
Guten Abend,
im Rahmen einer Aufgabe soll ich ein Programm "Schalter" programieren, wobei auf einer Form per ButtonKlick auf zufälligen Positionen jeweils zufällig große Bit-Buttons erstellt werden, die alle die Caption "Aus" haben, und sobald man einen anklickt auf "An" gehen sollen. Erst wenn man nochmal darauf klickt, ändert sich die Caption wieder zu "Aus". Insgesamt verwende ich zwei Units. Hier mein Problem: ich habe das Programm soweit programmiert, unter anderem habe ich einen Constructor (Create) überschrieben, doch bei der Ausführung kommt die Fehlermeldung, die Deklaration weiche von der ursprünglichen Deklaration ab. Ich weiß nicht wie ich diesen Fehler beheben kann! Hier der Quelltext:
Delphi-Quellcode:
unit mSchalter;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,mPanelDemo, StdCtrls, Buttons, mTaster1; type TForm1 = class(TForm) BtGruenPanel: TButton; procedure BtGruenPanelClick(Sender: TObject); private { Private-Deklarationen } Gedrueckt: Boolean; public { Public-Deklarationen } constructor Create (AOwner:TComponent; Farbe:TColor); override; end; type TBuntSchalter = Class (TBuntPanel) protected procedure MouseDown (Button: TMouseButton; Shift: TShiftState; X,Y: Integer);override; procedure MouseUp (Button: TMouseButton; Shift: TShiftState; X,Y: Integer); override; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.BtGruenPanelClick(Sender: TObject); var GruenPanel: TGruenPanel; MyBuntSchalter: TBuntSchalter; begin GruenPanel:=TGruenPanel.Create(Form1); GruenPanel.Parent:=Form1; GruenPanel.Left:=200; GruenPanel.Height:=50; MyBuntSchalter:=TBuntSchalter.Create(Form1); MyBuntSchalter.Parent:=Form1; MyBuntSchalter.BringToFront; end; procedure TBuntSchalter.MouseDown (Button: TMouseButton; Shift: TShiftState; X,Y: Integer); begin if Gedrueckt then begin BevelOuter := bvRaised; Caption := 'aus'; inherited MouseUp (Button,Shift,X,Y) end else begin BevelOuter := bvLowered; Caption := 'an'; inherited MouseDown (Button, Shift,X,Y); end; Gedrueckt := Not Gedrueckt; end; procedure TBuntSchalter.MouseUp (Button: TMouseButton; Shift: TShiftState; X,Y: Integer); begin end; constructor TBuntSchalter.Create(AOwner:TComponent; Farbe:TColor); begin inherited Create(AOwner, Farbe); Caption := 'aus'; Gedrueckt := False; end; end. Unit 2:
Delphi-Quellcode:
unit mPanelDemo;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,ExtCtrls, Buttons; type TGruenPanel = class (TBitBtn) public constructor Create (AOwner:TComponent);virtual; end; type TBuntPanel = class (TBitBtn) public constructor Create (AOwner:TComponent);virtual; end; implementation constructor TGruenPanel.Create (AOwner:TComponent); begin inherited Create (AOwner); Color:=clGreen; BorderWidth:=1; BevelOuter:=bvNone; BevelInner:=bvRaised; BevelWidth:=4; end; constructor TBuntPanel.Create (AOwner:TComponent); begin inherited Create (AOwner); randomize; Color:=RGB(Random(256), Random(256), Random(256)); BorderWidth:=1; BevelOuter:=bvNone; BevelInner:=bvRaised; BevelWidth:=4; left:=random(200); Width:=random(300); height:=random (200); top:=random(450); Caption := 'aus'; end; end. |
Re: Schalter Programm, Hilfe gesucht!
Ich würde mir eine globale Varibale vom Typ TObjectList in der Form definieren. Diese wird im OnCreate erstellt und im OnDestroy der Form wieder zerstört. Die Button erstellen Routine würde dann ungefähr so aussehen:
Delphi-Quellcode:
Das kann man auch wunderbar in eine Schleife packen um mehrere Buttons zu erstellen. Jetzt noch die onClick-Methode erstellen:
var
NewButton: TBitBtn; begin NewButton := TBitBtn.Create(Self); NewButton.Parent := Self; NewButton.Caption := 'Aus; NewButton.OnClick := ButtonClick; DeineObjektListe.Add(NewButton);
Delphi-Quellcode:
Beim OnDestroy der Form gehst du noch die Objektliste durch und .Freest alle Buttons bevor du letztendlich die Liste freigibst. Und das wars auch schon...
if Sender is TBitBtn then
begin if TBitBtn(Sender).Tag = 0 then begin TBitBtn(Sender).Tag := 1; TBitBtn(Sender).Caption := 'An'; end else begin TBitBtn(Sender).Tag := 0; TBitBtn(Sender).Caption := 'Aus'; end; end; |
Re: Schalter Programm, Hilfe gesucht!
hmm danke vielmals für die schnelle Antwort! Aber gibt es keine andere Möglichkeit, das der Constuctor in mSchalter funktioniert? ich glaube dass irgendwo ein Fehler ist, aber ich verzweifle langsam an der Suche danach...
Das mit der Objektliste hatten wir bisher noch nicht, deshalb würde ich die variante mit den Constructoren bevorzugen. Grundsätzlich muss es ja klappen, ich weiß nur nicht warum es das nicht tut :D |
Re: Schalter Programm, Hilfe gesucht!
Du überschreibst den Konstruktur der Form, implementierst ihn dann aber als TBuntPanel.
Die Objektliste musst du nicht unbedingt verwenden, wäre halt parktischer wenn man später wenn die Buttons schon erstellt wurde diese noch ändern möchte. |
Re: Schalter Programm, Hilfe gesucht!
Hi Andreas L,
mir erschliesst sich, in deinem Beispiel, noch nicht ganz für was du die Objectlist brauchst. Grüsse Rainer |
Re: Schalter Programm, Hilfe gesucht!
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
mir ist das jetzt klar. Die Buttons wurden lokal erzeugt und dann in der Objectlist abgelegt. Mir geht immer noch der Sinn des Ganzen ab. Wäre es nicht genau das Gleiche gewesen wenn ich das Array global definiert hätte? OK mit der Liste hast du eine dynamische Verwaltung deiner Buttons und kannst eventuell noch andere Objects verwalten. Habe mal ein kurzes Beispiel geproggt um zu zeigen wie man soetwas nutzen kann. Mit Button1 werden die Buttons erstellt. Mit Button2 wird jeweils einer davon gelöscht. Übrigens: mit DeineObjektListe.OwnsObjects:=true; veranlasst man, dass die Liste die angehängten Objekte selbst verwaltet. Es genügt also ein Element aus der Liste zu löschen, dann ist es auch freigegeben. xxx.free ist dann völlig überflüssig.
Delphi-Quellcode:
Grüsse
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Contnrs, Qbuttons; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Button2: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } DeineObjektListe:tobjectlist; procedure ButtonClick(Sender: TObject); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.ButtonClick(Sender: TObject); begin if Sender is TButton then begin if TButton(Sender).Tag = 0 then begin TButton(Sender).Tag := 1; TButton(Sender).Caption := 'An'; end else begin TButton(Sender).Tag := 0; TButton(Sender).Caption := 'Aus'; end; label1.caption:=inttostr(TButton(Sender).top)+'/'+inttostr(TButton(Sender).left); end; end; procedure TForm1.Button1Click(Sender: TObject); var NewButton:array[1..10,1..10] of TButton;n,m:integer; begin For n:=1 to 10 do For m:=1 to 10 do begin NewButton[n,m] := TButton.Create(Self); NewButton[n,m].Parent := Form1; NewButton[n,m].Caption := 'Aus'; NewButton[n,m].top:=n*NewButton[n,m].height; NewButton[n,m].left:=m*NewButton[n,m].width; NewButton[n,m].OnClick := ButtonClick; DeineObjektListe.Add(NewButton[n,m]); end; end; procedure TForm1.FormCreate(Sender: TObject); begin DeineObjektListe:=TObjectList.create; DeineObjektListe.OwnsObjects:=true; end; procedure TForm1.FormDestroy(Sender: TObject); var n:integer; begin // For n:=DeineObjektListe.Count-1 do DeineOjektliste.items[n].free;---> durch DeineObjektListe.OwnsObjects:=true überflüssig DeineObjektListe.Free; end; procedure TForm1.Button2Click(Sender: TObject); begin DeineObjektListe.Remove(DeineObjektListe.items[22]); end; end. Rainer |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz