Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Button click abfragen


fritz_07 - Mo 25.01.10 19:41
Titel: Button click abfragen
Hallo an alle!

Folgendes Problem:
Wenn ich das erste Mal den Button1 klicke,soll eine Prozedur aufgerufen werden.
Beim zweiten Klick auf den gleichen Button, soll eine andere Prozedur aufgerufen werden.
Ist dies realisierbar?

In kurzform geschrieben: einmal Button1.click -> Aktion in Variable abspeichern und einer Prozedur zuordnen

Gruß fritz_07

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


jaenicke - Mo 25.01.10 19:44

Du brauchst bei der ersten Aktion ja nur zu speichern, dass die erste Aktion ausgeführt wurde und wenn dies beim Klick der Fall ist die zweite stattdessen ausführen. Dafür reicht ein Feld unter private zum Beispiel.

Du kannst natürlich auch eine zweite OnClick Prozedur anlegen und die direkt zuweisen, aber das ist eigentlich gar nicht notwendig.


dasEnde:D - Mo 25.01.10 19:54

Naja keine Ahnung was du vor hast.

Also bei nur einer Procedur kannst du eine privat Variable deklarieren (boolean). Diese Lösung ist natürlich recht unschön und man sollte sie möglichst vermeiden.

Bei VIELEN Proceduren wehre ein Enum oder ein Array praktisch.


jaenicke - Mo 25.01.10 20:07

user profile icondasEnde:D hat folgendes geschrieben Zum zitierten Posting springen:
Also bei nur einer Procedur kannst du eine privat Variable deklarieren (boolean). Diese Lösung ist natürlich recht unschön und man sollte sie möglichst vermeiden.
Warum das? Wenn es nur zwei Fälle gibt, dann ist das doch genau das richtige. Ansonsten braucht man für die Umsetzung eines endlichen Automaten eben mehr Fälle und damit andere Typen.

Eigentlich müsste man aber auch schon daran, ob bereits Daten aus dem ersten Schritt vorhanden sind, erkennen können welcher Schritt der aktuelle ist. :gruebel:


dasEnde:D - Mo 25.01.10 20:15

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Naja der Grund ist recht einfach. Auch bei endlichen Automaten sollte man unbedingt Variablen verhindern die einen zu großen Scope haben (Stichpunkt Lokale Variablen). Naja und eine Private Variable ist nun nicht viel besser. Man kommt dan bei größeren Projekten durcheinader bzw. vergiest manchmal welche (oder Setz dank schlechter Namengebun die Falsche Variable).
Lösung: Entweder solche zustände verhindern oder die Projektdaten schön Kapseln und Set und Get funktionen verwenden.
P.S. ich hab keine Ahnung wie groß das ding wird ^^. Bei kleinen Projekten oder solchen wo man eh schon fast vertig ist und nichts erweitern will ist ab und zu eine Privat Variable okay.
Aber man darf es nicht ausarten lassen.


fritz_07 - Mi 27.01.10 22:53

Hallo

Ich versuche mein Problem mal etwas besser darzustellen.


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:
procedure TForm1.Button1Click(Sender: TObject);
var koned1, koned2, Dir2 : String;                

begin

 if (koned1=''or (koned2=''then                                      //beim ersten Klick wird diese Abfrage ausgeführt
     MessageDlg('Bitte Eingaben überprüfen',mtWarning,[mbRetry],0)
      else
      begin
      SysUtils.ForceDirectories(koned1);
      SysUtils.ForceDirectories(koned2);
      end;


 

     begin                                      //und diese Abfrage soll erst beim zweiten Klick auf den Button ausgeführt werden                    
      
      if SysUtils.DirectoryExists(Dir2) then
          HinweisV
      end;

end;


Wie kann ich einen Zähler einbauen,der das Klicken des Buttons speichert?



Gruß fritz_07

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt


Delete - Mi 27.01.10 22:56

Deklariere dir eine Variable und zähl sie einfach hoch.


elundril - Do 28.01.10 00:13

kannst auch gleich die Eigenschaft "Tag" verwenden, wenn du sie nicht schon anderweitig benutzt.

lg elundril


ALF - Do 28.01.10 11:31

Hi,

Ich gehe mal davon aus, das die Procedure nur ein kurzer Auszug ist.
denn es fehlt ja noch einiges!?
Mein Tipp:
Du kannst aber auch die 2.Abfrage als erstes stellen und mit exit die Proc. dort verlassen wenn Verzeichniss vorhanden! :wink:

So kannst Du auch mit einem Button 2 abfragen stellen!
Ist aber nicht die feine englische Art :lol:

Gruss Alf


Mike19 - Do 28.01.10 11:49

Hallo,

ich hatte dieses Problem mit der der Änderunge der Caption des Button gelöst (Abhängig vom Ergebnis der 1. Abfrage). Habe dann aber später gemerkt, dass es sehr unübersichtlich wird. Deshalb meine Meinung, leg 2 Buttons an und steure diese mit Enabled.


max1235 - Do 28.01.10 11:54

wie das ende schon geschrieben hat
Zitat:
Also bei nur einer Procedur kannst du eine privat Variable deklarieren (boolean). Diese Lösung ist natürlich recht unschön und man sollte sie möglichst vermeiden.
einfach eine variable vom typ boolean nehmen und dann


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
tfrom1.buttonclick(sender:tobject);
if variable= false then
begin
...
variable:=true;
end;

if variable=true then
begin
...
end;
end;



und vorher die variable natürlich auf false setzten


guinnes - Do 28.01.10 12:05

user profile iconmax1235 hat folgendes geschrieben Zum zitierten Posting springen:


Delphi-Quelltext
1:
if variable=true then                    

Wohl besser nicht : http://www.delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/page/4/


elundril - Do 28.01.10 12:10

generell, warum eine globale Booleanvariable erzeugen wenn man doch schon so schön einen brach liegenden Integer beim Button dabei hat?

lg elundril


ALF - Do 28.01.10 12:22

user profile iconmax1235
Zitat:
einfach eine variable vom typ boolean nehmen und dann


user profile iconelundril
Zitat:
generell, warum eine globale Booleanvariable erzeugen wenn man doch schon so schön einen brach liegenden Integer beim Button dabei hat?


Schaut doch mal alle richtig hin, er will doch nur 2 Abfragen mit einem Button.
Nicht ob der Button schon mal benutzt wurde!

Demzuvolge sollte es reichen, die richtige Reienfolge der Abfrage zu stellen.
Er hat ja schon alles drin!
Warum also komplizierter machen als notwendig!? :lol:

Gruss ALf


elundril - Do 28.01.10 12:45

falsch, er will zwei unterschiedliche prozeduren je nach buttonklick. beim ersten klick soll die prozedur1 ausgeführt werden, beim zweiten mal klicken prozedur2.

lg elundril


ALF - Do 28.01.10 13:06

ja, was ist, wenn er die 2.Prozedure zuerst ausführt und dort ein exit einfügt!?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
 procedure TForm1.Button1Click(Sender: TObject);
begin      
       if SysUtils.DirectoryExists(Dir2) then
       begin        
           HinweisV; {verzeichnis vorhanden exit}
           exit;
       end;
       
      if (koned1=''or (koned2=''then 
          MessageDlg('Bitte Eingaben überprüfen',mtWarning,[mbRetry],0
     else
     begin 
         SysUtils.ForceDirectories(koned1);
         SysUtils.ForceDirectories(koned2); 
     end;
end;


Alles mit einem Button und 2 Prozeduren ohne Zusätze oder!?
Korregiert mich wenn ich falsch bin bezogen auf seinen (Button Click) :wink:


thepaine91 - Do 28.01.10 13:08

Dann kann man sich das Exit aber sparen indem man:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
begin      
       if SysUtils.DirectoryExists(Dir2) then     
         HinweisV {verzeichnis vorhanden exit}
       else 
         if (koned1=''or (koned2=''then 
           MessageDlg('Bitte Eingaben überprüfen',mtWarning,[mbRetry],0
         else
         begin 
           SysUtils.ForceDirectories(koned1);
           SysUtils.ForceDirectories(koned2); 
         end;
end;


ALF - Do 28.01.10 13:12

Lol, an else hab ich ja gar nicht gedacht! :lol:
ist natürlich richtig, else, exit ist in diesem Fall überflüssig!
Gruss Alf


elundril - Do 28.01.10 13:14

und was ist wenn er nur das erste mal die eine prozedur haben will und die restlichen male immer die andere, egal ob das directory noch existiert (einmal erstellt, was dann damit passiert ist wurscht)?

lg elundril


thepaine91 - Do 28.01.10 13:20

Wo wir beim alt bekannten Tema wären: Was will er denn eigentlich. ^^


ALF - Do 28.01.10 13:28

Wir sollten vielleicht warten bis er sich meldet!? dann wissen wir genaueres 8)
Sein Buttonclick gibt dies aber so wie er da steht, nicht her. So wie ich es sehe hatt er nur die Reienfolge der Abfrage Falsch. Zum schluss kommt bei ihm, sonst evtl. die 2.Meldung nach der ersten, und dies ist ja sicherlich nicht was er will!

Warten wir also biss er sich meldet!?
Befor durch missverständnisse ein Disput ausbricht :wink:
Gruss Alf


baka0815 - Do 28.01.10 16:49


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:
procedure TForm1.FormCreate(Sender: TObject);
begin
  DeleteFile('Anzahl.xml');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  XMLParser: TXMLParser;
  XMLAttribut: TXMLAttribute;
  WieOftGeklickt: Integer;
begin
  WieOftGeklickt := 0;
  try
    XMLParser := TXMLParser.Create('Anzahl.xml');
    try
      XMLAttribut := XML.Parser.GetAttributeByXPath('/settings/@count');
      try
        WieOftGeklickt := StrToIntDef(XMLAttribut.Value);
      finally
        XMLAttribut.Free;
      end;
    finally
      XMLParser.Free;
    end;
  except
  end;

  case WieOftGeklickt of
    0// ...
    1// ...
    else ShowMessage('Zu oft geklickt!');
  end;

  Inc(WieOftGeklickt);

  try
    XMLParser := TXMLParser.Create('Anzahl.xml');
    try
      XMLAttribut := XML.Parser.GetAttributeByXPath('/settings/@count');
      try
        XMLAttribut.Value := WieOftGeklickt;
      finally
        XMLAttribut.Free;
      end;
      XMLParser.Save;
    finally
      XMLParser.Free;
    end;
  except
  end;

end;


SCNR :D


fritz_07 - Do 28.01.10 21:29

Hallo an alle,

danke für die zahlreiche Unterstützung.

Korrekt erfast hat es elundril

Zitat:
falsch, er will zwei unterschiedliche prozeduren je nach buttonklick. beim ersten klick soll die prozedur1 ausgeführt werden, beim zweiten mal klicken prozedur2.

lg elundril



Es ist jetzt erst mal unwichtig welche von beiden Prozeduren zuerst gestartet wird, es dreht sich um die Auswertung vom dem Klick.
An die Verarbeitung von Tag, oder Sender hatte ich auch schon gedacht.
Das Tag wird ja eindeutig einem Button zugewiesen (Tag0 = Button1, Tag1 = Button2, usw.),würde in meinem Fall nichts bringen.
Dann wäre noch das Verarbeiten des Sender's. Muß ich mir erst noch genauer durchlesen.

Ich hätte an so etwas gedacht.
Eine Variable z.B. klick : Integer; und in dieser wird dann der erste Klick gespeichert.

Gruß fritz_07


jaenicke - Do 28.01.10 21:43

user profile iconfritz_07 hat folgendes geschrieben Zum zitierten Posting springen:
An die Verarbeitung von Tag, oder Sender hatte ich auch schon gedacht.
Das Tag wird ja eindeutig einem Button zugewiesen (Tag0 = Button1, Tag1 = Button2, usw.),würde in meinem Fall nichts bringen.
Doch, denn beim ersten Klick ist Tag z.B. 0, daraufhin führst du die Aktion für den ersten Klick durch und setzt Tag auf 1. Beim nächsten Klick siehst du dann Tag ist 1, also führst du die Aktion für den zweiten Klick durch.

Analog geht das eben mit einem Boolean-Wert unter private oder einem Integer-Wert dort.


Tilman - Do 28.01.10 21:53

Ansonsten kann man auch einfach zwei Buttons übereinander setzen und den oberen nach dem ersten klick auf visible=false stellen. Ist vielleicht nicht die sauberste Lösung, aber funktioniert und ist einfach. :)


elundril - Do 28.01.10 21:55

:shock: wollen wir nur funktionierende Lösungen bieten oder auch gute?


Tilman - Do 28.01.10 22:03

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
:shock: wollen wir nur funktionierende Lösungen bieten oder auch gute?

Na ich denke am besten alle oder? ;)

So ginge es auch, klick1 ist im Objektinspektor gesetzt:


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:
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure klick1(Sender: TObject);
    procedure klick2(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.klick1(Sender: TObject);
begin
  ShowMessage('Eins');
  button1.OnClick := klick2;
end;

procedure TForm1.klick2(Sender: TObject);
begin
  ShowMessage('Zwei');
end;


wobei ich mir nicht 100% sicher bin ob das ändern des Eventhandlers im Handler selbst legal ist, aber scheint zu funzen.

Btw: wenn Tag schon gesetzt ist, man aber weitere Propertys an eine Komponente hängen möchte, kann man diese entweder ableiten (was den Nachteil hat dass man sie zur Entwurfszeit nicht verwenden kann, es sei denn man installiert sie auch ordnungsgemäß), oder man hängt an Tag einen Record an. Dann kann man in Tag so viele Daten reinzwängen wie man will. Dazu kann man Tag als Pointer verwenden.


ALF - Fr 29.01.10 18:05

Hi, ich misch mich noch mal ein, in der Hoffnung das ich was dazu lerne! :wink:
user profile iconelundril
Zitat:
wollen wir nur funktionierende Lösungen bieten oder auch gute?


Meine Frage dazu. Was ist zur Laufzeit? Welchen Zustand hatt der Button gerade?
(Erkennbar doch nur am Ergebnis oder?)
Ist nicht das Ergebnis der Prozeduren wichtiger?
Kleines praktisches Beispiel aus dem Leben :)
Du kommst in Dein Zimmer, drückst auf den Lichtschalter, nix passiert. Frage: Welchen Zustand hat der Schalter
?

Sollte man nicht lieber, wegen der Übersichtlichkeit im Programmcode, in den Prozedureergebnis überprüfen welcher Zustand ist?
Was ist, wenn noch eine 3. oder 4. Prozedur rein soll, als Beispiel.
Einfach den Tag erhöhen oder zusätzliche Clickprocedures schreiben, um das event des Buttons zu ändern!?
Ich weis also nicht, welches die gute Lösung ist!
Aber ich gehe davon aus, das mein Denkansatz falsch ist :roll:

Korregiert mich wenn ich Falsch bin!
Gruss Alf


fritz_07 - Fr 29.01.10 23:01

Hallo,

Ich habe den Quellcode von Tilman mal ausprobiert und es hat nicht funktioniert.
Ich kann aber auch nicht sagen,wo der Fehler liegt.


Könnte man so etwas als Zähler verwenden?

Delphi-Quelltext
1:
2:
 with (Sender as TButton) do
            Tag := Tag + 1;



Alf, dein Denkansatz ist nicht falsch,ich würde es auch so sehen.


Gruß fritz_07


jaenicke - Fr 29.01.10 23:13

Das funktioniert zwar, aber das with solltest du dir gar nicht erst angewöhnen. Spätestens wenn du das erste Mal stundenlang einen dadurch verursachten Fehler gejagt hast, wirst du es bereuen, wenn du das oft einsetzt...

Delphi-Quelltext
1:
2:
  if Sender is TButton then
    TButton(Sender).Tag := TButton(Sender).Tag + 1;
Denn um bei deinem Beispiel zu bleiben:
Wenn man das with übersieht, dann würde man denken man würde das Tag des Formulars ansprechen. Und wundert sich dann, dass sich das gar nicht ändert.


ALF - Sa 30.01.10 06:59

user profile iconfritz_07
Zitat:
Alf, dein Denkansatz ist nicht falsch,ich würde es auch so sehen.

Halt, halt, halt, nicht so schnell! Weil Du mit den Button.Tag nicht bescheid weisst, heist es noch lange nicht das es nicht geht!
Alles hat seine Vor- und Nachteile!

Beispiel 1: die Abfrage über den Button.Tag, hat hier durchaus seine Berechtigung :!:

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:
procedure TForm1.Button1Click(Sender: TObject);
begin
      if Button2.Tag < 2 then
         MessageDlg('Du hast die Infos noch nicht gelesen. Bitte klicke Button2', mtInformation, [mbOK], 0)
     else
         MessageDlg('Alle Infos gelesen', mtInformation, [mbOK], 0)

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
     case Button2.Tag  of
          0begin
               MessageDlg('Das war der erste Klick',mtInformation, [mbOK], 0);
               Button2.Tag := 1;
             end;
          1begin
               MessageDlg('Das war der zweite Klick',mtInformation, [mbOK], 0);
               Button2.Tag := 2;
             end;
          2begin
               MessageDlg('Nun gibt es keinen mehr',mtInformation, [mbOK], 0);
               Button2.Enabled := false;
             end;
      end;
end;


Grund, Du erzeugst keine globalen Ergebnisse, die Du weiter verwenden willst. Mal so ausgedrückt :wink:

Beispiel 2: Hier könntest Du auch mit Button.Tag arbeiten

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:
procedure TForm1.Button3Click(Sender: TObject);
var i: integer;
begin
     if not passwd or (passwdindex < 3then  {if (Button3.Tag = 0) or (i < 3) then}
     begin
         if edit1.Text = '' then exit
         else
         if passwdmd5(Edit1.Text) then
            passwd := true                    {Button3.Tag := 1}
         else
         begin
                                              {if i > 3 then Button3.Tag := 3} 
                                              {inc(i)}
            inc(passwdindex);
            MessageDlg('Falsche Passworteingabe', mtInformation, [mbOK], 0);
         end
     end
     else
     if  passwdindex > 3 then                 {if Button3.Tag > 1 then}
     begin
         MessageDlg('3 falsche Eingaben. Der Login wird gesperrt!'+#10#13+' Melde dich beim Superadmin', mtInformation, [mbOK], 0);
         Button3.Enabled := False;
     end;

end;


HINWEIS: Die Beispiele sollen nur als Vergleich dienen!!!!!
Damit würdest Du aber keine Sicherheit haben ob die Ergebnisse so sind, wie du sie haben willst. Schlimmer noch. Bei komplexeren Proceduren wüsstest Du auch nicht mehr, was wie wo und warum, das so ist!

Es sei, das user profile iconelundril
Zitat:
.... (einmal erstellt, was dann damit passiert ist wurscht)?
damit recht hatt :shock:

Ich habe nicht in Abrede gestellt, das man dies so nicht machen kann. Ich will nur Hinweisen das es nicht gut ist!
Es währe ein schlechtes Forum, wenn man nicht darauf Hinweisen würde! :wink:

Auch auf die Gefahr eines Disput
Gruss Alf


elundril - Sa 30.01.10 07:18

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:

Es sei, das user profile iconelundril
Zitat:
.... (einmal erstellt, was dann damit passiert ist wurscht)?
damit recht hatt :shock:

Ich habe nicht in Abrede gestellt, das man dies so nicht machen kann. Ich will nr Hinweisen das es nicht gut ist!


ich hab nie gesagt das es gut ist wenn man das so macht. ;) es war lediglich eine konkrete Lösung auf das Problem das fritz_07 geschildert hat. Weil es ja sein könnte das er den code den er gepostet hat nur als Beispiel sieht und mit unserer Lösung ganz was anderes machen will, so wie zb du in deinen Beispielen gezeigt hast. ;)

lg elundril


ALF - Sa 30.01.10 07:32

Hi, user profile iconelundril moin.

Gebs dem Coder drum das Du recht hast. :zustimm:
Nur glauben mag ich es nicht :flehan: :zwinker:

Gruss Alf


ffgorcky - Sa 30.01.10 14:13

Also ich denke immer noch, dass es doch so am einfachsten wäre, wenn er wirklich nur zwei unterschiedliche Sachen aufgerufen haben möchte:

Erst mal einfach eine Form-Variable deklarieren:

Delphi-Quelltext
1:
DurchGang1GleichTrue:boolean;                    

Und dann einfach in der Prozedur abfragen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if DurchGang1GleichTrue then
    begin
    Hier macht er das eine
    end
else
    begin
    Und hier mach er dann das andere
    end;
//Und hier dann fürs nächste mal den anderen auswählen:
DurchGang1GleichTrue :=not(DurchGang1GleichTrue );


fritz_07 - Di 02.02.10 22:26

Hallo,

ich habe mal ein paar Sachen ausprobiert,bin aber noch nicht so richtig glücklich damit.
Hier mal mein Beispiel:
Eigentlich sind es sogar drei Abfragen.


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:
// Abfrage 1; prüfen ob Pfad eingegeben oder vergessen wurde

     begin

          if  (koned1=''or (koned2=''then                     

                  MessageDlg('Bitte Eingaben überprüfen',mtWarning,[mbRetry],0)
          else
             begin
                  SysUtils.ForceDirectories(koned1);
                  SysUtils.ForceDirectories(koned2);
                  HinweisJ;
             end;
     end;

// Abfrage 2; prüfen,ob Verzeichnisse erstellt wurden
 
     begin

          if not SysUtils.DirectoryExists(Dir2) then    
             begin
                  HinweisN;
             end;
       end;


//Abfrage 3; wird das Formular zum erstellen der Verzeichnisse noch einmal aufgerufen (weshalb auch immer),
//           wird geprüft,ob Verzeichnisse Vorhanden sind,wenn ja Abfrage 1 und 2 überspringen

     begin

          if SysUtils.DirectoryExists(Dir2) then         
             begin
                  HinweisV;
             
             end;
          end;

      end;


Ich habe es auch versucht, über die Button.Tag Abfrage zu lösen,hat aber nicht ganz funktioniert.

Soweit funktioniert es auch,nur das mit dem Überspringen bei der 3.Abfrage noch nicht.
Wie setze ich das in die richtige Reihenfolge?



Gruß fritz_07


elundril - Di 02.02.10 22:27

schon mal mit if-then-else-if-then-else-if-then probiert?

lg elundril


ALF - Di 02.02.10 22:37

ich alt mich jetzt zurück! :mrgreen:


Xearox - Mi 03.02.10 13:53

user profile iconfritz_07 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo

Ich versuche mein Problem mal etwas besser darzustellen.


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:
procedure TForm1.Button1Click(Sender: TObject);
var koned1, koned2, Dir2 : String;                

begin

 if (koned1=''or (koned2=''then                                      //beim ersten Klick wird diese Abfrage ausgeführt
     MessageDlg('Bitte Eingaben überprüfen',mtWarning,[mbRetry],0)
      else
      begin
      SysUtils.ForceDirectories(koned1);
      SysUtils.ForceDirectories(koned2);
      end;


 

     begin                                      //und diese Abfrage soll erst beim zweiten Klick auf den Button ausgeführt werden                    
      
      if SysUtils.DirectoryExists(Dir2) then
          HinweisV
      end;

end;


Wie kann ich einen Zähler einbauen,der das Klicken des Buttons speichert?



Gruß fritz_07

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt



Delphi-Quelltext
1:
2:
3:
4:
begin                                      //und diese Abfrage soll erst beim zweiten Klick auf den Button ausgeführt werden                    
  if SysUtils.DirectoryExists(Dir2) then
    HinweisV
end;


fehlt da nicht ein Semikolon?


Delphi-Quelltext
1:
2:
if SysUtils.DirectoryExists(Dir2) then
    HinweisV;


martin300 - Mi 03.02.10 14:54

Hier nochmals das gleiche, nur mit dem 'Tag' beim Button:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.btn1Click(Sender: TObject);
begin
  btn1.Tag := btn1.tag + 1;

  if btn1.Tag <= 1 then
  begin
    // hier das 1x Klick
    ShowMessage('1');
  end else
  begin
    // hier das 2x (und noch viel mehr) Klick
    ShowMessage('2');
  end;

end;


baka0815 - Do 04.02.10 08:10

user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:


Delphi-Quelltext
1:
2:
3:
4:
begin                                      //und diese Abfrage soll erst beim zweiten Klick auf den Button ausgeführt werden                    
  if SysUtils.DirectoryExists(Dir2) then
    HinweisV
end;


fehlt da nicht ein Semikolon?


Delphi-Quelltext
1:
2:
if SysUtils.DirectoryExists(Dir2) then
    HinweisV;


Nein. In Delphi ist kein explizites Semikolon vor einem end notwendig.
Verleitet meiner Meinung nach zu schlechtem Stil.


elundril - Do 04.02.10 10:47

es is so oder so schon schlechter stil wenn man unnötige begins und ends reinhaut. ;)


fritz_07 - Fr 05.02.10 22:49

Hallo,

nach einigen Versuchen bin ich jetzt zu diesem Ergebnis gekommen.


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:
     begin
            if (koned1=''or (koned2=''then
            begin
              MessageDlg('Bitte Eingaben überprüfen',mtWarning,[mbRetry],0);     // die erste Abfrage wird so oft ausgeführt,bis die zwei Variablen nicht mehr
              Exit;                                                          // leer sind und erst dann werden die Verzeichnisse erstellt
            end

             else
              begin
              SysUtils.ForceDirectories(koned1);
              SysUtils.ForceDirectories(koned2);
              Schreiben;
              end;
     end;


     begin                                                      // und mit der zweiten Abfrage prüfe ich,ob die Verzeichnisse auch wirklich erstellt wurden,
     if not SysUtils.DirectoryExists(Dir2) then                 // somit entfällt dann die dritte Abfrage
     HinweisN

      else
        HinweisJ;
     end;


"Warum denn das Leben immer unnötig schwer machen,wenn es auch einfacher geht" :wave:

Ich bedanke mich bei allen für die super Unterstützung.


Mfg fritz_07


ALF - Fr 05.02.10 23:25

Hi, noch ein kleiner Tip!

Schau Dir mal in der DH ForceDirectories an, da kannst Du auch was abfragen!

Gruss ALf


FinnO - Sa 06.02.10 22:58

Hi noch ein kleiner Tip!

Schau dir mal im DT [http://delphi-treff.de/] den Styleguide an, da kann man deinen Code dann besser lesen!

Gruss FinnO