AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Schalter Programm, Hilfe gesucht!

Ein Thema von KingMax · begonnen am 1. Nov 2009 · letzter Beitrag vom 2. Nov 2009
Antwort Antwort
KingMax

Registriert seit: 30. Aug 2009
7 Beiträge
 
#1

Schalter Programm, Hilfe gesucht!

  Alt 1. Nov 2009, 20:54
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.
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#2

Re: Schalter Programm, Hilfe gesucht!

  Alt 1. Nov 2009, 21:00
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...
  Mit Zitat antworten Zitat
KingMax

Registriert seit: 30. Aug 2009
7 Beiträge
 
#3

Re: Schalter Programm, Hilfe gesucht!

  Alt 1. Nov 2009, 21:06
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
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#4

Re: Schalter Programm, Hilfe gesucht!

  Alt 1. Nov 2009, 21:09
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.
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Schalter Programm, Hilfe gesucht!

  Alt 2. Nov 2009, 05:38
Hi Andreas L,
mir erschliesst sich, in deinem Beispiel, noch nicht ganz für
was du die Objectlist brauchst.

Grüsse
Rainer
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Schalter Programm, Hilfe gesucht!

  Alt 2. Nov 2009, 06:14
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
Angehängte Dateien
Dateityp: zip objectlist_175.zip (300,3 KB, 2x aufgerufen)
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 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