Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi IF-Problem (https://www.delphipraxis.net/71582-if-problem.html)

danku 17. Jun 2006 17:50


IF-Problem
 
sry wird gerade überarbeitet.

Matze 17. Jun 2006 18:03

Re: IF-Problem
 
Lass doch mal bitte bei den if-Abfragen das "=true" und "=false" weg und schreib nur

Delphi-Quellcode:
if RadioButton1.Checked
oder eben

Delphi-Quellcode:
if not RadioButton1.Checked
Dann formatiere das bitte etwas, vor allem bei den begin/ends mit der EInrückung. Sehr übersichtlich ist es z.B. so:

Delphi-Quellcode:
begin
  code
  code
  begin
    code
  end;
end;
Denn so habe ich persönlich keine Lust, das auseinander zu friemeln und mich da einzulesen. :)


Edit: Huch, irgendwie überarbeitest du es ja schon. Evtl. kannst du meinen Beitrag dann ignorieren. ;)

danku 19. Jun 2006 09:38

Re: IF-Problem - >Timerabhängigkeit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab jetzt die If-klauseln noch mal alle überarbeitet.
folgendes problem kommt zum vorschein:
ich habe 2 timer für die zwei. radiogroups:

Timer1 (timerzeit)
Delphi-Quellcode:
...
//////// ZEITDAUER IN MIN

timerfest.Enabled :=false; //der timer von der 2.rg

if edzeit.Text='00'
  then begin edzeit.text:='01'
  end;

  Button1.Caption:='Abbrechen';

      if cbsignal.Checked=false then begin
     // opendialog1.Execute;
      cbsignal.checked:=true;
      end;
     
  rgzwei.Enabled:=false;

  dtAlarm2 := StrToTime(edende.Text + ':' + edende2.Text + ':' + edende3.Text) + StrToDate(cbdatum.Text);
  if Now < dtAlarm2 then
    ShowRemainingTime2(dtAlarm2)
    else begin //datei abspielen
    CoolTrayIcon1.ShowMainForm;
    with MediaPlayer1 do
        begin
          if cbsignal.checked
          then begin
          Filename := OpenDialog1.Filename;
          Open;
          Play;
          timerzeit.Enabled:=false;
          end;
        end;
  ..
Timer2 (Timerfest)
Delphi-Quellcode:
//////// Feste Uhrzeit

timerzeit.Enabled :=false; //timer1
dtAlarm := StrToTime(edhours.Text + ':' + edmin.Text + ':' + edseconds.Text) + StrToDate(cbdatum.Text);



   if rgzwei.Checked then begin
    rgeins.Enabled:=false;
    cbdatum.Enabled:=false;
    cbsignal.Enabled:=false;
    end;
    Button1.Caption:='Abbrechen';

    if (dtAlarm) < (now) //einen tag höher setzen
      then begin cbdatum.ItemIndex:= 1;
      end;
      if cbsignal.Checked=false then begin
         // opendialog1.Execute;
          cbsignal.checked:=true;

          end;
            if Now < dtAlarm then
            ShowRemainingTime(dtAlarm)
            else begin //datei abspielen
            CoolTrayIcon1.ShowMainForm;
            with MediaPlayer1 do
                begin
                  if cbsignal.checked
                  then begin
                  Filename := OpenDialog1.Filename;
                  Open;
                  Play;
                  speedbutton2.Visible:=true;
                  timer3.Enabled:=true;
                 end;
              end;
         
...
Um die Timer zu starten betätigt man den START-Button:
Delphi-Quellcode:
if rgeins.checked=true
  then if button1.Caption='Starten'
  then begin timerzeit.Enabled:=true;
  end;
if rgzwei.checked=true
  then if button1.Caption='Starten'
  then begin timerfest.Enabled:=true;
  end;


if (button1.Caption='Abbrechen')
then if (rgeins.checked) and (timerzeit.Enabled=true)
      then if MessageDlg('Timer ändern?', mtConfirmation, [mbYes, mbNo], 0) =
        mrYes then begin
        timerzeit.Enabled:=false;
       // timerfest.Enabled:=true;
          rgzwei.Enabled:=true;
          mehours.text:='00';
          memin.Text:='00';
          meseconds.text:='00';
          mediaplayer1.Close;
          cbsignal.Enabled:=true;
          button1.Caption:='Starten';
          mediaplayer1.Close;
          end;

if (button1.Caption='Abbrechen')
then if (rgzwei.checked) and (timerfest.Enabled=true)
      then if MessageDlg('Timer ändern?', mtConfirmation, [mbYes, mbNo], 0) =
        mrYes then begin
        timerfest.Enabled:=false;
        // timerzeit.Enabled :=true;
          rgeins.Enabled:=true;
          mehours.text:='00';
          memin.Text:='00';
          meseconds.text:='00';
          mediaplayer1.Close;
          cbsignal.Enabled:=true;
          button1.Caption:='Starten';
          mediaplayer1.Close;
          end;
Sobald bspw. die 1.radiogroup geklickt wurde und der START-Button,
wird der zähler in den 3 unteren memofeldern um 1 verringert. (wie countdown)
das geschieht solange bis '00'; dann wird eine datei abgespielt.
durch betätigen des START-Buttons wird automatisch die caption in Abbrechen umbenannt.

wenn der zähler vorzeitig abgebrochen (Abbrechen -> Caption wieder STARTEN umbenannt) wird, soll anhand der 2.radiogroups der timer2 geladen werden und time1 zurückgesetzt werden. das funzt ja auch alles einwandfrei nur ist das problem, sobald man die 1.radiogroup abbricht, und dann in der 2.radiogroup klickt und da STARTEN klickt wird der timer von der 1.radiogroup aktiviert. warum?
andersherum ist es genauo...

Sidorion 19. Jun 2006 10:19

Re: IF-Problem
 
1. then if meiden .. da blickt niemand durch, vor allem wenn Du else-Zweige nutzt. Allerdings kannst Du bei End Else If durchaus in der aktuellen Einrückungsebene bleiben, ist aber nach Gusto.
2. end immer auf Höhe vom begin .. dann siehst Du besser, ob alle Ebenen auch wirklich ein end haben
3. then und begin entweder immer hinten oder immer auf neuer Zeile, wobei du sie auch getrennt schreiben kannst: then hinten und begin auf neuer Zeile. Auch hier gilt auf gleicher Höhe mit if. Eingerückt wird erst der Block zwischen Begin und End.
4. das gleiche gilt für With .. do, repeat .. until, while/For ... do
5. nie unvermittelt einrücken, nur innerhalb Begin .. End. Wenn Du gedanklich einen neuen Abschnitt anfängst, dann lasse eine Zeile aus oder schreibe eine Kommentarzeile. Du kannst auch einfach so einen bagin-end-block ohne ifs schreiben, wenn Du unbedingt zur Hervorhebung weiter einrücken willst.
6. if immer einzeilig oder mit begin..end, vor allem, wenn das Then hinten steht. Man schreibt schnell mal was unter einen If und dann machter was ganz anderes.
7. das sind keine Gesetze, sondern Vorschläge, damit andere auch eine chance haben, deinen Code zu lesen. Du kannst Dir auch eigene Regeln aufstellen, solltest sie dann aber STRIKT befolgen. Hilft auch Dir selber, wenn Du Deinen Code nach 2 Jahren wieder anschaun musst.

danku 19. Jun 2006 16:43

Re: IF-Problem
 
hm das sind doch aber alles nur "schönheitssachen", zum besseren lesen.
das hat doch aber nicht wirklich mit meinen problem zu tun. :roll:

danku 23. Jun 2006 08:51

Re: IF-Problem
 
das problem liegt irgendwie bei:

Delphi-Quellcode:
if rgeins.checked
then timerzeit.Enabled:=true
else timerfest.Enabled:=true;

//auf umständliche weise wie:
if rgeins.checked
  then if button1.Caption='Starten'
  then begin
  timerfest.enabled:=true;

if rgzwei.checked
...
//funzt auch nicht
wenn bspw. eine checkbox(2/2) gewählt wurde,
auf den START-Button geklickt wurde,
wird der timer von der zugehörigen radiogroup gesetzt.
zur laufzeit (d.h. wenn timer geladen wird) ändert sich die caption in ABBRECHEN.
problematisch wird es wenn Abbrechen gedrückt wird
und anstatt der vorherigen checkbox in die andere checkbox geklickt wird und diesmal
auf STARTEN geklickt wird.
Denn hier wird immer noch der alte Timer von der 1.checkbox geladen.
Warum? :(

xZise 23. Jun 2006 21:44

Re: IF-Problem
 
Zitat:

Zitat von danku
hm das sind doch aber alles nur "schönheitssachen", zum besseren lesen.
das hat doch aber nicht wirklich mit meinen problem zu tun. :roll:

Weil niemand mehr durch den Code durchblickt...

Warum schreiben wir denn alle nicht so:
Delphi-Quellcode:
procedure TForm1.TimerTimer(Sender : TObject) var i : Byte; begin for i := 0 to 4 do begin Showmessage(IntToStr(i) + '. Zahl'); Label1.Text := IntToStr(i) + '. Zahl ist dran'; end; end;
Da bruach man erstmal 5 Minuten bis man sieht, wies funzt, aber so:
Delphi-Quellcode:
procedure TForm1.TimerTimer(Sender : TObject)
var i : Byte;
begin
  for i := 0 to 4 do begin
    Showmessage(IntToStr(i) + '. Zahl');
    Label1.Text := IntToStr(i) + '. Zahl ist dran';
  end;
end;

danku 24. Jun 2006 16:53

Re: IF-Problem
 
hm das mit der überschaubarkeit ist mir schon klar.
so krass wie deins code ich allemal nicht.
mein problem ist aber immer noch nicht geklärt.

Der_Unwissende 24. Jun 2006 18:09

Re: IF-Problem
 
Zitat:

Zitat von danku
hm das mit der überschaubarkeit ist mir schon klar.
so krass wie deins code ich allemal nicht.
mein problem ist aber immer noch nicht geklärt.

Hi, dir ist aber schon klar, dass sich keiner deinem Problem annehmen wird, solange du solche Beiträge verfässt?
Also sorry, ein wenig Gemeinschaft gehört nun mal zum Forum und damit etwas Mitarbeit von jedem. Die Leute die dir bis jetzt schrieben meinen es nicht böse, sondern wollten dir helfen. Es kostet dich doch nicht viel Zeit deinen Code mal etwas umstrukturiert (lesbar) hinzuschreiben. Das hilft dir mit Sicherheit auch, vielleicht findest du dann deinen Fehler auch schon selbst. Jedenfalls fände ich es fast unverständlich wenn dir jmd. mit dem Code (und der Reaktion auf die anderen Beiträge) hilft.
Und wenn du dabei bist, versuch doch bitte gleich dein Problem etwas klarer zu schildern. Unter Laufzeit versteht man dass das Programm gestartet wurde (läuft). Die Alternative dazu ist die Designzeit (wenn dein Programm nicht läuft und du die Fenster designst). Zudem werden die Timer nicht geladen, sie werden ggf. erzeugt (denke du setzt sie jedoch schon zur Designzeit), gestartet und gestoppt.
Also tut mir leid, aber ich habe zumindest nicht wirkich das Gefühl dein Problem verstanden zu haben, wäre also schön wenn du es mit dem geänderten Code und einer klaren Erklärung nochmal versuchen könntest, dann hilft dir auch sicher gerne jmd. (und nach der Anzahl deiner Beiträge zu Urteilen solltest du das alles schon längst wissen).

Gruß Der Unwissende

danku 24. Jun 2006 20:00

Re: IF-Problem
 
okay erfolgt morgen.

danku 25. Jun 2006 17:04

Re: IF-Problem
 
So sieht das Layout aus:
http://www.danielkuhnke.de/bsp.jpg

Bei anklicken der jeweiligen Radiogroups werden folgende Timer geöffnet:

Für die Linke Radiogroup (Timerzeit)

Delphi-Quellcode:
//////// ZEITDAUER IN MIN

dtAlarm2 := StrToTime(edende.Text + ':' + edende2.Text + ':' + edende3.Text) + StrToDate(cbdatum.Text);

image1.Visible:=false;
speedbutton2.Visible:=false;
timer3.Enabled :=false;

cbshutdown.Enabled:=false;
cbsignal.Enabled:=false;
rgzwei.Enabled:=false;

timerfest.Enabled :=false;

Button1.Caption:='Abbrechen';

if edzeit.Text='00'
  then begin edzeit.text:='01'
  end;

if cbsignal.Checked=false then begin
// opendialog1.Execute;
cbsignal.checked:=true;
end;
     

  if Now < dtAlarm2 then
    ShowRemainingTime2(dtAlarm2)
    else begin //datei abspielen
    CoolTrayIcon1.ShowMainForm;
    with MediaPlayer1 do
        begin
          if cbsignal.checked
          then begin
          Filename := OpenDialog1.Filename;
          Open;
          Play;
          timerzeit.Enabled:=false;
          speedbutton2.Visible:=true;
          image1.Visible :=true;
          timer3.Enabled:=true;
          timerzeit.Enabled:=true;
          end;
        end;

Und für die rechte Radiogroup: (Timerfest)

Delphi-Quellcode:
//////// Feste Uhrzeit


dtAlarm := StrToTime(edhours.Text + ':' + edmin.Text + ':' + edseconds.Text) + StrToDate(cbdatum.Text);

image1.Visible:=false;
speedbutton2.Visible:=false;
timer3.Enabled :=false;

timerzeit.Enabled :=false;

rgeins.Enabled:=false;
cbdatum.Enabled:=false;
cbsignal.Enabled:=false;
cbshutdown.Enabled:=false;

Button1.Caption:='Abbrechen';

    if  (dtAlarm) < (now) //einen tag höher setzen
      then begin cbdatum.ItemIndex:= 1;
      end;    

      if cbsignal.Checked=false then begin
         // opendialog1.Execute;
          cbsignal.checked:=true;
          end;

      if Now < dtAlarm then
      ShowRemainingTime(dtAlarm)
      else begin //datei abspielen
      CoolTrayIcon1.ShowMainForm;
          with MediaPlayer1 do
          begin
          if cbsignal.checked
          then begin
          Filename := OpenDialog1.Filename;
          Open;
          Play;
          timerfest.enabled:=false;
          speedbutton2.Visible:=true;
          timer3.Enabled:=true;
          image1.Visible :=true;
          Abbrechen:=true;
          //timerfest.Enabled:= true;
                 end;
              end;
           end;
In den unteren 3 memos wird wie in einem countdown heruntergezählt.
(in abhängikeit von den eingestellten endzeiten der 2 radiogroups)
Damit man die Timer starten kann, muss auf STARTEN-Button gedrückt werden:
Delphi-Quellcode:
if rgeins.checked
then timerzeit.Enabled:=true
else timerfest.Enabled:=true;

if (button1.Caption='Abbrechen') and (rgeins.checked)
      then if MessageDlg('Timer ändern?', mtConfirmation, [mbYes, mbNo], 0) =
        mrYes then begin
        timerzeit.Enabled:=false;
        //timerfest.Enabled:=true;

          rgeins.Checked:=true;
          rgzwei.Enabled:=true;
          //cbsignal.Checked:=false;
          //cbshutdown.Checked:=false;

          mehours.text:='00';
          memin.Text:='00';
          meseconds.text:='00';

          mediaplayer1.Close;
          cbsignal.Enabled:=true;
          cbshutdown.Enabled:=true;
          button1.Caption:='Starten';
         
          speedbutton2.Visible:=false;
          timer3.Enabled:=false;
          image1.Visible:=false;
          end;


if (button1.Caption='Abbrechen') and (rgzwei.checked)
      then if MessageDlg('Timer ändern?', mtConfirmation, [mbYes, mbNo], 0) =
        mrYes then begin
        timerfest.Enabled :=false;
        timerzeit.Enabled :=false;

          rgeins.Enabled:=true;
          rgzwei.Checked:=true;
          mehours.text:='00';
          memin.Text:='00';
          meseconds.text:='00';

          mediaplayer1.Close;
          cbsignal.Enabled:=true;
          cbshutdown.Enabled:=true;
          button1.Caption:='Starten';

          speedbutton2.Visible:=false;
          timer3.Enabled:=false;
          image1.Visible:=false;
          end;
sobald eine radiogroup ausgewählt wurde und auf STARTEN-Button gedrückt wurde,
wird wie bereits gesagt der countdown in den memos gesetzt.
es wird automatisch sobald auf STARTEN gedrückt wird, der Button in ABBRECHEN umbenannt.

Hier ein Bild davon: www.danielkuhnke.de/bsp2.jpg

Und nun zum eigentlichen Problem:
die linke radiogroup wird ausgewählt, der song herausgesucht und auf STARTEN gedrückt.
in den memos wird die restzeit angezeigt. nach dieser zeit wird der song abgespielt.

wenn man auf Abbrechen drückt, und die 2.radiogroup auswählt und song heraussucht und auf STARTEN drückt, wird der timer von der linken radiogroup geladen.
Warum? sobald man die 2. radiogroup und dann die 1. wählt, passiert das gleiche.
wer kann mir helfen?
bin verzweifelt!

danku 29. Jun 2006 18:12

Re: IF-Problem
 
kann mir keiner helfen?

Matze 29. Jun 2006 18:20

Re: IF-Problem
 
Moin

Der Code ist so unstrukturiert, da fällt einem es wirklich schwer, das zu überschauen. Könntest du vielleicht das Projekt anhängen?

danku 29. Jun 2006 18:47

Re: IF-Problem
 
okay. ich geb zwar ungern den code heraus,
aber hier ist die pas-datei ;)
und zur veranschaulichung die exe-datei.
das programm hat noch ein paar macken,
die ich demnächst noch bereinigen werde.
bsp. die 60er minutenanzeige

Matze 29. Jun 2006 18:51

Re: IF-Problem
 
Zitat:

Zitat von danku
okay. ich geb zwar ungern den code heraus,

Dazu sag ich jetzt mal nichts. ;)

Zitat:

Zitat von danku
aber hier ist die pas-datei ;)

Mir ist das zu aufwändig, das Formular zusammenzuklicken um es kompilieren zu können. Musst auf die Antworten anderer Mitglieder warten, sorry.

Der_Unwissende 29. Jun 2006 19:15

Re: IF-Problem
 
[OT]
@danku:
Sorry dass ich es mal so sage (also in diesem Thread), aber es hat nunmal direkt mit all dem was du hier bisher getan hast zu tun. Ich finde (ist damit also nur meine persönliche Meinung), dass du echt alles tust um keine Hilfe zu erhalten. Es ist echt so, dass die DP jedem gerne hilft (bzw. ihre Mitglieder), bei dir hier hätte ich keine Lust mehr (sorry).
Es ist ganz einfach so, dass du alle Bitten getrost ignorierst. Ich meine wenn sich Matze (der bestimmt genug anderes zu tun hat) schon dazu bereit erklärt, deinen Code zu strukturieren, dann solltest du das zu schätzen wissen.

Zitat:

Zitat von Matze
Könntest du vielleicht das Projekt anhängen?

Ok, kein Projekt angehängt. Nebst Antworten wie:

Zitat:

Zitat von danku
hm das sind doch aber alles nur "schönheitssachen", zum besseren lesen.
das hat doch aber nicht wirklich mit meinen problem zu tun. :roll:

Zitat:

Zitat von danku
hm das mit der überschaubarkeit ist mir schon klar.
so krass wie deins code ich allemal nicht.
mein problem ist aber immer noch nicht geklärt.

Also beim besten Willen, so wird dir sicherlich keiner Helfen. Dies hier ist ein Forum. Schau mal in die Regeln und verinnerliche sie etwas.
Helfen werden dir sicherlich nicht Leute wenn du weiterhin solche Beiträge lieferst. Ganz ehrlich, deine Kommentare sind mehr als unhöflich, deine Mitarbeit faktisch nicht vorhanden (du hast es immer noch nicht geschafft deinen Code zu strukturieren) und dann kommt noch das mit der pas Datei...
Also ganz ehrlich, ich habe nur einen ISDN Kanal, warum sollte ich also Interesse daran haben ein großes Kompilat runter zu laden. Gebeten wurdest du von jmd. (der deine Arbeit übernehmen wollte) das Projekt anzuhängen. Jeder hätte es so als kleines Paket runterladen und selbst kompilieren können.

Ich kann dir wirklich nur den Tipp geben (den kannst du natürlich wie alle anderen ignorieren) dich etwas mehr einem Forum entsprechend zu verhalten. Andernfalls dürfte es für dich echt schwer werden je Hilfe zu finden (alles nur meiner Meinung nach).

Gruß Der Unwissende
[/OT]

Sidorion 30. Jun 2006 10:37

Re: IF-Problem
 
Das sind eben nicht 'Schönheitssachen'. Hässlicher Code ist grundsätzlich fehlerhaft. Nur schöner Code kann auch richtig sein. Programmieren hat nämlich durchaus etwas mit Ästhetik zu tun.
Einbuchohneodermitunsinnigerinterpu
nktionundformatierungkannauchke.inschweinlesenegal wi esehrmansichanstrengtundwennmansnichtles.enkannkan nmanauchdiefehlernichtfindenunddann
istmanaufgeschmissenundmu,ssinderdpnachfrageno,bwo hlmaneigentlichauchselberdrauf gekommenwarewennmandencod.eordentlichformatierthät te.
[edit]p.s.: zum Formatieren war ich zu faul ;)[/edit]

danku 30. Jun 2006 12:44

Re: IF-Problem
 
ist ja wieder gut. :|
hab ja schon genug auweh von euch bekommen. :?
problem habe ich selber gelöst. sry wenn ich ein bissel unsauber gecodet habe.
habt ja recht das es eine ordnung gibt...

jmit 30. Jun 2006 16:45

Re: IF-Problem
 
Hallo,

Zitat:

Zitat von danku
ist ja wieder gut. :|
hab ja schon genug auweh von euch bekommen. :?
problem habe ich selber gelöst. sry wenn ich ein bissel unsauber gecodet habe.
habt ja recht das es eine ordnung gibt...

schön, dass Du jetzt den Fehler gefunden hast, aber es würde mich, und wahrscheinlich die anderen ebenfalls, interessieren, wo der Fehler lag. Dein Sourcecode ist mir zu unübersichtlich.

Gruß Jörg

danku 30. Jun 2006 17:30

Re: IF-Problem
 
ich hab in dem timer statt if... end; if...end
einen else zweig dazugefügt.
das war alles lol.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:04 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