Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Schalter Programm, Hilfe gesucht! (https://www.delphipraxis.net/142685-schalter-programm-hilfe-gesucht.html)

KingMax 1. Nov 2009 20:54


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.

Andreas L. 1. Nov 2009 21:00

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:
var
  NewButton: TBitBtn;
begin
  NewButton := TBitBtn.Create(Self);
  NewButton.Parent := Self;
  NewButton.Caption := 'Aus;
  NewButton.OnClick := ButtonClick;
  DeineObjektListe.Add(NewButton);
Das kann man auch wunderbar in eine Schleife packen um mehrere Buttons zu erstellen. Jetzt noch die onClick-Methode erstellen:
Delphi-Quellcode:
  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;
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...

KingMax 1. Nov 2009 21:06

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

Andreas L. 1. Nov 2009 21:09

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.

R2009 2. Nov 2009 05:38

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

R2009 2. Nov 2009 06:14

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:
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.
Grüsse
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