Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Button dopellt belegen


Public Enemy - Mo 25.08.08 17:54
Titel: Button dopellt belegen
Hallo zusammen,

mein Problem ist folgendes und zwar mache ich ein Programm in dem es ein Button geben soll der 2 Aktionen durchführen soll. Also beim ersten mal drauf klicken soll alles (Buttons, Zeichenfelder) andere drumherum verschwinden und beim wiederholten male alles wieder sichtbar sein.

Zum verstecken der Objekte benutze ich ganz einfach

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// Beispiel
procedure TForm1.VersteckeGeklickt(Sender: TObject);
begin

 Knopf_Beenden.verstecke;
 Knopf_Berechnen.verstecke;

end;


Wie man sie sichtbar machen würde mit einem zweiten Button wüsste ich. Aber nicht wie es geht wenn man zum wiederholten male auf einen drückt.

Hoffe ihr könnt mir helfen.

Gruß PE


Mike19 - Mo 25.08.08 17:59

Hallo,

teste doch einfach bei click, wie der Zustand der Felder ist (Visible False oder True). Danach kanns Du festlegen, wass geschehen soll.

Micha


Tilman - Mo 25.08.08 18:11

Knopf.verstecken gibt es normal ja nicht - entweder ist es Pseudocode oder du hast den Button abgeleitet. Egal, ich gehe mal davon aus dass der Button trotzdem eine Eigenschaft .visible hat:


Delphi-Quelltext
1:
knopf.visible := not knopf.visible;                    


Damit wird der Knopf abwechseln Sichtbar und unscihtbar gemacht, immer das Gegenteil von dem was er schon ist.

Allgemeiner würde es mit ner Zählvariable für die Zustände gehen, damit könnte man dann auch mehr als 2 Zustände unterscheiden.

Grüße,
tilman


Public Enemy - Mo 25.08.08 19:24

user profile iconTilman hat folgendes geschrieben:
Knopf.verstecken gibt es normal ja nicht - entweder ist es Pseodocode oder du hast den Button abgeleitet. Egal, ich gehe mal davon aus dass der Button trotzdem eine Eigenschaft .visible hat:


Delphi-Quelltext
1:
knopf.visible := not knopf.visible;                    


Damit wird der Knopf abwechseln Sichtbar und unscihtbar gemacht, immer das Gegenteil von dem was er schon ist.

Allgemeiner würde es mit ner Zählvariable für die Zustände gehen, damit könnte man dann auch mehr als 2 Zustände unterscheiden.

Grüße,
tilman


Danke für eure antworten.

Deine hat mir nun geholfen. Vielen Danke nochmal für eurer schnelle Hilfe. Bin noch ziemlich am Anfang mit Delphi daher kann es auch sein, dass ich mich nicht richtig ausdrücke.

Bin also natürlich offen für alle anderen Möglichkeiten bzw. Verbesserung meiner Fragestellung.
Ach ja und noch ne Frage ist es Möglich wenn mein Button von vornherein Verstecke heißt und ich drauf klick dort steht Anzeige?

Gruß PE


Narses - Mo 25.08.08 19:38

Moin und :welcome: im Forum!

user profile iconPublic Enemy hat folgendes geschrieben:
Bin also natürlich offen für alle anderen Möglichkeiten bzw. Verbesserung meiner Fragestellung.
Wir haben auch einen FAQ-Eintrag zu diesem Problem (Beispiel B) [http://www.delphi-library.de/topic_AppState+Teil1_67969.html]. :les: ;)

//EDIT:
user profile iconPublic Enemy hat folgendes geschrieben:
Ach ja und noch ne Frage ist es Möglich wenn mein Button von vornherein Verstecke heißt und ich drauf klick dort steht Anzeige?
Normalerweise gilt hier: Pro Thread nur eine Frage. Aber da du neu bist, machen wir mal eine Ausnahme: ;)
Klar geht das, einfach mit

Delphi-Quelltext
1:
Button1.Caption := 'Neuer Titel des Buttons';                    
den Titel ändern. :idea:

cu
Narses

//EDIT: Link korrigiert (er mochte die Zahl nicht)


Hidden - Mo 25.08.08 19:44

Hi,

Ich hole mal meine Glaskugel raus. Vermutlich handelt es sich um ein Schulprojekt; ich durfte heute die kaputtgeänderte VCL-Umgebung an unseren Schulrechnern testen. Und dort haben die die Klassen auch abgeleitet und alles ins deutsche übersetzt, und die Komponenten dort haben meine ich diese Methode.

Imho absoluter blödsinn - zumal dann im Zentralabi wieder die englischen Begriffe gefragt sind. Auf den Lehrplänen steht aber erstmal: Kann keiner Englisch -> eindeutschen :(

gut, genug OT: Wenn ich dich richtig verstanden habe, 'tauschst' du im Moment die Buttons, hast also ständig einen visible und einen hidden.

Auch zu deinem Edit: Imho wäre es performanter, wenn du den Button umbenennst und die Methode auswechselst:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click1(Sender: TObject);
begin
  Button1.Caption := 'Verstecken';
  Button1.OnClick := Button1Click2;
end;

procedure TForm1.Button1Click2(Sender: TObject);
begin
  Button1.Caption := 'Ausklappen';
  Button1.OnClick := Button1Click1;
end;


Zu deinem Edit: die Eigenschaft 'Caption' enthält die Aufschrift des Buttons ;)

mfG,


Public Enemy - Mo 25.08.08 20:04

Okay Sry wegen den 2 Frage in diesen Thread werde ich mir merken für das nächste mal ;-)

Und ja es handelt sich um ein Schulprojekt.Glaube ist auch erstmal uninteressant was es ist für meine Fragen (glaube ich?? Ja müsste :-))

Das zu den Buttons es geht darum Das der eine Button immer sichtbar ist und dises wird genutzt um alles andere drumherum zu verstecken und wieder sichtbar zu machen. Aber diese Pro ist ja gelöst.
Natürlich verstehe ich nicht wie es hiermit geht


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click1(Sender: TObject);
begin
  Button1.Caption := 'Verstecken';
  Button1.OnClick := Button1Click2;
end;

procedure TForm1.Button1Click2(Sender: TObject);
begin
  Button1.Caption := 'Ausklappen';
  Button1.OnClick := Button1Click1;
end;


Ich möchte dir mal meinen ganzen Code zeigen.


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:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
unit mForm_fibfak;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, mEtikett, mTextfeld, mKnopf, mZeilenbereich,
  mZeichenbereich;

type
  TForm1 = class(TForm)
    Knopf_Fibonacci: TKnopf;
    Knopf_Fakultaet: TKnopf;
    Knopf_Loeschen: TKnopf;
    Knopf_Verstecken: TKnopf;
    Knopf_Beenden: TKnopf;
    Textfeld_Eingabe: TTextfeld;
    Etikett_Eingabefeld: TEtikett;
    Zeichenbereich_Boom: TZeichenbereich;
    Zeilenbereich_Bam: TZeilenbereich;
    procedure Knopf_Beendengegklickt(Sender: TObject);
    procedure Knopf_VersteckenGeklickt(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Knopf_Beendengegklickt(Sender: TObject);
begin
self.close;
end;

procedure TForm1.Knopf_VersteckenGeklickt(Sender: TObject);
begin

Etikett_Eingabefeld.visible := not Etikett_Eingabefeld.visible;
Knopf_Beenden.visible := not Knopf_Beenden.visible;
Knopf_Fakultaet.visible :=  not Knopf_Fakultaet.visible;
Knopf_Fibonacci.visible :=  not Knopf_Fibonacci.visible;
Knopf_Loeschen.visible :=  not Knopf_Loeschen.visible;
Textfeld_Eingabe.visible := not Textfeld_Eingabe.visible;
Zeilenbereich_Bam.visible  :=  not Zeilenbereich_Bam.visible;
Zeichenbereich_Boom.visible :=  not Zeichenbereich_Boom.visible;


end;

end.


Wie man sieht kann man das Programm beenden mit einem Knopfdruck und man kann Sachen verstecken und anzeigen lassen.
Das erste was ich machen würde jetzt nach deinem Post wäre es ins Englische zu packen richtig?


Hidden - Mo 25.08.08 20:11

user profile iconNarses hat folgendes geschrieben:
Wir haben auch einen FAQ-Eintrag zu diesem Problem (Beispiel B) [http://www.delphi-library.de/topic_AppState+Teil1_67969.html].


Narses Link hat folgendes geschrieben:

Allgemeiner Fehler

Not Found

Die Seite, die Du aufgerufen hast, ist auf unserem Delphi-Library.de Server nicht vorhanden.
Benutze doch einfach die Suchfunktion um eine passende Seite zu finden.


Sollte da wieder wer branch verlinkt haben oder so? ;)

@2 Fragen: Imho ist das ein Konzeptänderungsvorschlag, an dem auch anderen, die dieser Thread weiterbruingen sollte, helfen dürfte.

mfG,

Moderiert von user profile iconNarses: Link korrigiert


Narses - Mo 25.08.08 20:21

Moin!

user profile iconHidden hat folgendes geschrieben:
Sollte da wieder wer branch verlinkt haben oder so? ;)
Nein nein, da hat uns Jemand inzwischen eine "Lösung" gebastelt... ;)

Beim Link-Hint-Text darf keine weitere Zahl alleine stehen. :idea: Habs korrigiert.

cu
Narses


Delete - Mo 25.08.08 22:49

wieso möchtest denn zwei buttons? nenn sie doch einfach nach dem klick um ... :-)

PS: sollt auch in .NET gehen ;-)


Public Enemy - Di 26.08.08 15:22

user profile iconGrenzgaenger hat folgendes geschrieben:
wieso möchtest denn zwei buttons? nenn sie doch einfach nach dem klick um ... :-)

PS: sollt auch in .NET gehen ;-)



so war es auch gedacht wenn ich draufgeklickt habe, das es den Namen ändert also den Angezeigten.


Achso ich erstelle alles unter Delphi 6.


Danke für dei obigen Beiträge mach mich sofort wieder ran ;-)


Delete - Di 26.08.08 21:47

tja, dann gehts doch einfach...

im onClick event einfach schreiben


Delphi-Quelltext
1:
myButton.caption := 'myNewLabel';                    


und schon hast du es gelöst ... ggf, kannst du das mit dem tag eintrag noch koppeln ... :-)

<HTH> GG


Public Enemy - Di 26.08.08 22:32

Habe das so eingetragen. Gibt auch keinen Fehler aus, aber er macht es einfach nicht wenn ich druff klicke.

Bzw. Keine Ahnung ob ich es an der richtigen Stelle eingetragen habe. Habe noch nie was von onClick event gehört xD

Denke aber dass es das ist wenn ich auf den Button doppel klicke und dann in der Prozedur bin?


Hidden - Mi 27.08.08 13:09

user profile iconPublic Enemy hat folgendes geschrieben:
Denke aber dass es das ist wenn ich auf den Button doppel klicke und dann in der Prozedur bin?

Jap, sollte die OnClick-prozedur sein :gruebel:

Meine Galskugel ist leider in letzter Zeit etwas stumpf geworden, ich polier die dann später mal :roll:

Am besten ist es wohl, du hängst einmal das gesammte Projekt ohne Exe als Archiv an.

mfG,


Public Enemy - Mi 27.08.08 15:07

Hier ist der ganze Ordner ohne meine EXE.

Ich hoffe man kann dadurch schauen.
Sorry habe nicht gesehen wo es war. Es sei mir verziehen.
mfg

PE


Timosch - Mi 27.08.08 15:15

user profile iconPublic Enemy hat folgendes geschrieben:
Hier ist der ganze Ordner ohne meine EXE.

Ich hoffe man kann dadurch schauen.

Download Komponentenübung;

http://www.xup.in/dl,38541943/Komponentenuebung_25.08.2008.rar/

mfg

PE

Bitte anhängen. Dazu gibt es die Option "Dateianhang hinzufügen", wenn du einen Beitrag schreibst.


Hidden - Mi 27.08.08 19:37

Hi,

Als erstes kannst du deinem Lehrer(?) mal gratulieren: Durch die Verwendung eurer übersetzten Komponenten ist der VCL-Teil inkompatibel geworden, das haben sie toll hinbekommen(!)^^. Weiß, dass das leider ziemlich verbreitet ist, denke aber mal du kannst ihn überzeugen, dass ihr englsich könnt ;)

Punkt 1: Du erzeugst im Formcreate eine Instanz einer Klasse 'Fibo'. Diese solltest du von der Theorie her im FormDestroy auch wieder freigeben.

Punkt 2: Die von dir genannten Änderungen(Caption, das dürfte dann bei euch nirgendwie 'Aufschrift' heißen) sind in der angehängten Version nicht implementiert ;).

Müsste dann hier sein:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Knopf_VersteckenGeklickt(Sender: TObject);
begin
  // Objekte verschwinden lassen und wieder anzeigen
  Etikett_Eingabefeld.visible := not Etikett_Eingabefeld.visible;
  Knopf_Beenden.visible := not Knopf_Beenden.visible;
  Knopf_Fakultaet.visible :=  not Knopf_Fakultaet.visible;
  Knopf_Fibonacci.visible :=  not Knopf_Fibonacci.visible;
  Knopf_Loeschen.visible :=  not Knopf_Loeschen.visible;
  Textfeld_Eingabe.visible := not Textfeld_Eingabe.visible;
  Zeilenbereich_Bam.visible  :=  not Zeilenbereich_Bam.visible;
  Zeichenbereich_Boom.visible :=  not Zeichenbereich_Boom.visible;
  //hier Aufschrift ändern. Mit Bollean-Variable(was bei euch wahrscheinlich Wahrheitswert oder so heißt :hair:) merken, welche Caption gerade angezeigt wird
end;


mfG,


Public Enemy - Mi 27.08.08 19:48

user profile iconHidden hat folgendes geschrieben:
Hi,

Als erstes kannst du deinem Lehrer(?) mal gratulieren: Durch die Verwendung eurer übersetzten Komponenten ist der VCL-Teil inkompatibel geworden, das haben sie toll hinbekommen(!)^^. Weiß, dass das leider ziemlich verbreitet ist, denke aber mal du kannst ihn überzeugen, dass ihr englsich könnt ;)

Punkt 1: Du erzeugst im Formcreate eine Instanz einer Klasse 'Fibo'. Diese solltest du von der Theorie her im FormDestroy auch wieder freigeben.

Punkt 2: Die von dir genannten Änderungen(Caption, das dürfte dann bei euch nirgendwie 'Aufschrift' heißen) sind in der angehängten Version nicht implementiert ;).

Müsste dann hier sein:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Knopf_VersteckenGeklickt(Sender: TObject);
begin
  // Objekte verschwinden lassen und wieder anzeigen
  Etikett_Eingabefeld.visible := not Etikett_Eingabefeld.visible;
  Knopf_Beenden.visible := not Knopf_Beenden.visible;
  Knopf_Fakultaet.visible :=  not Knopf_Fakultaet.visible;
  Knopf_Fibonacci.visible :=  not Knopf_Fibonacci.visible;
  Knopf_Loeschen.visible :=  not Knopf_Loeschen.visible;
  Textfeld_Eingabe.visible := not Textfeld_Eingabe.visible;
  Zeilenbereich_Bam.visible  :=  not Zeilenbereich_Bam.visible;
  Zeichenbereich_Boom.visible :=  not Zeichenbereich_Boom.visible;
  //hier Aufschrift ändern. Mit Bollean-Variable(was bei euch wahrscheinlich Wahrheitswert oder so heißt :hair:) merken, welche Caption gerade angezeigt wird
end;


mfG,



Hmm also ihn zu überzeugen klappt wohl nicht. Kann man eben nichts dran ändern leider -.-

Also zu Punkt 1. ich verstehe nichts von dem! Ich könnte nur vermuten was gemeint ist aber diese Wörter habe ich noch nie gehört.

Punkt 2. Joar habe ich schon gesucht ob es sowas gibt. Das einzige was funzt ist wenn ich self. mach dann zeigt D mir auch cption an.

Zu dem unteren Kommentar genau es heißt bei uns Wahrheitswert. Was meinst du mit Aufschrift.

Sorry für die ganzen Umstände, aber ich komme mir gerade echt bescheuert und nichts wissend vor. :roll:


Marc. - Mi 27.08.08 19:56

user profile iconPublic Enemy hat folgendes geschrieben:
Also zu Punkt 1. ich verstehe nichts von dem! Ich könnte nur vermuten was gemeint ist aber diese Wörter habe ich noch nie gehört.

Schau Dir dazu am besten den entsprechenden Teil von user profile iconChristians Tutorial [http://christian-stelzmann.de/index_tutorials_crashkurs.html] an. :zwinker:


Hidden - Mi 27.08.08 20:15

user profile iconPublic Enemy hat folgendes geschrieben:
Sorry für die ganzen Umstände, aber ich komme mir gerade echt bescheuert und nichts wissend vor. :roll:

Sry, das war nicht meine Absicht :(

Wenn ich das richtig sehe(Stand Delphi 4, NRW(EG Lippstadt)) habt ihr mehrere Reiter und arbeitet im Unterricht mit einem, der 'Schule' heißt. Auf anderen Reitern befinden sich die 'normalen', englischsprachigen Komponenten. Das nur so als Randinformation, will dich hier keinesfalls animieren, dich mit deinem Lehrer über D/E-Unterricht zu streiten^^ :zwinker:

Zu Punkt 1: Eine Klasse ist eine Datenstruktur, von der sogenannte Instanzen erzeugt werden müssen(ursprünglich eine fehlübersetzung des englischen 'instance', hat sich inzwischen eingebürgert). Für andere Datentypen wie Integer(Zahl? :autsch:) oder Boolean wird automatisch speicher angefordert. Instanzen von Klassen musst du selbst erzeugen und freigeben(Speicher anfordern und wieder freigeben). Vergisst du die Freigabe, entstehen sogenannte 'Speicherlöcher'. Das ist Speicher, der zwar nichtmehr verwendet, aber auch nicht wieder freigeben wurde. Der Speicherverbrauch deines Programms wird dann immer größer und das ist nun wirklich unpraktisch ;).

Zu Punkt 2: 'self' bezieht sich auf das ausführende Objekt(Instanz einer Klasse). In deinem Fall ist das Form1(Instanz der Klasse TForm1. Also stets die Klasse vor dem Prozedurnamen - "procedure TForm1.Knopf_VersteckenGeklickt").

mfG,


Public Enemy - Mi 27.08.08 21:22

Ach für dieses Gefühl könnt ihr ja nichts. Ist ja eben so ;-)

Also wir arbeiten mit Delphi 6 und das mit dem Reiter stimmt. Dieser heisst bei uns SuM. Ach wegen Streit braucht ihr keine Sorgen machen wir haben uns immer in den Haare ;-)

Randinformationen finde ich ganz nützlich. Denn ich weiss ja garnicht wie ein reines Delphi aussieht xD


Okay habe es nun verstanden. Ich werde mich auf jeden Fall noch mit Delphi auseinander setzen. Diese Aufgabe gab mir einen kleinen Ruck. Also ich habe morgen Info und lasse mich dann mal überraschen was mein Lehrer sagt zu dem was ich bis jetzt auf die Bein gestellt habe mit eurer Hilfe. Vorallem wie er das löscht :?:

Ich werde mich dann bezüglich diesem Themas melden und die Lösung (falls es eine geben wird) Posten.

Nochmla Danke für die ganzen Hilfe hier.


Public Enemy - Sa 30.08.08 19:44

Sorry für Doppel Post, aber ich habe nun eine andere Delphi Version und einen Code den ich geschickt bekommen habe welcher auch halb funktioniert.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button2Click(Sender: TObject);
begin
 if Button2.Caption ='Verschwinden' then
 begin
  Edit1.Visible:=False;
  Edit2.Visible:=False;
  Button1.Visible:=False;
  Button2.Caption:='Zeigen';
  exit;
 end;
 if Button2.Caption = 'Zeigen' then
 begin
  Edit1.Visible:=True;
  Edit2.Visible:=True;
  Button1.Visible:=True;
  Button2.Caption:='Verschwinden';
  exit;
 end;
end;

end.


So wollte nun an dieser Stelle etwas anderes stehen haben und habe es ausgetauscht.

Button2.Caption:='Verschwinden';

Aber danach funktioniert es nicht mehr. Ich habe keine Ahnung wieso. Vielleicht könnt ihr nochmla gucken.

Gruß PE


Hidden - Sa 30.08.08 20:05

Hi,

Ich hab das mal etwas übersichtlicher geschrieben und berichtigt:

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:
procedure TForm1.SetzeSichtbarkeit(aVis: Wahrheitswert);  //in Variationen ausgeführter Code in eine gesonderte Prozedur packen, spart Tipparbeit ;)
begin
  Edit1.Visible := aVis;
  Edit2.Visible := aVis;
  Button1.Visible := aVis;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  KomposSichtbar: WAHRHEITSWERT;
begin
  if Button2.Caption ='Verschwinden' then
  begin
    SetzeSichtbarkeit(FALSCH);
    Button2.Caption := 'Zeigen';
    //Exit;  //das besser garnicht erst benutzen ;)
  end else begin
    if Button2.Caption = 'Zeigen' then begin
      SetzeSichtbarkeit(WAHR);
      Button2.Caption := 'Verschwinden';
      //exit;  //dito; hier wäre es übrigens sowieso zu Ende, ist überflüssig
    end;
  end;
  //noch kürzer könntet ihr es haben mit
  KomposSichtbar := Button2.Caption = 'Zeigen';
  SetzeSichtbarkeit(KomposSichtbar);
  if KomposSichtbar then
    Button2.Caption = 'Verstecken'
  else Button2.Caption = 'Zeigen';
end;


So, ich hab jetzt mal eurem Lehrer zu liebe sein Konzept nicht zerstört. 'WAHR' ist true, 'FALSCH' entsprechend false..

Zu deinem Problem: Meine Glaskugel hat leider einen Sprung. etwas verschwommen kann ich trotzdem erkennen, dass du immernoch auf die alte Caption prüfst, aber nun eine andere Schreibst ;) Auch könntest du auf Groß- und Kleinschreibung nicht geachtet haben.

mfG,


Public Enemy - Sa 30.08.08 23:05

Vielen Dank es geht jetzt Juhuu. Und nur wegen eurer Unterstützung.

Falls ihr es sehen wollt hier mein Ergebnis. Kann nun geclosed werden.