Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ShowMessage OnTimer (https://www.delphipraxis.net/8574-showmessage-ontimer.html)

Akut-Programming 8. Sep 2003 12:37


ShowMessage OnTimer
 
Hi!!!

Ich will in meinem Prog, was dann ma n Terminplaner darstellen soll eben auch ne Message anzeigen lassen. Das klappt ja auch so schon, nur kommt die Message nicht nur einmal, sondern wird ne ganze Minute oder so neu geöffnet.

Das Problem wollt ich damit lösen, das ich zum jeweiligen Termin beim speichern den Eintrag setze, das der Termin noch "nicht gemeldet" wurde.
Diesen wollt ich dann immer im Timer mit abfragen - Doch klappt das nich so... Hier ist ma mein Source vom Timer:

Delphi-Quellcode:
procedure Tfrm_terminplaner_main.Timer2Timer(Sender: TObject);
var
  i: integer;
  node: IXMLDOMNode;
  newTermin, newSub: IXMLDOMNode;
begin
    for i:=0 to lv_eintraege.Items.Count - 1 do begin
    node :=xmlDoc.selectSingleNode('/PlanView/termin[terminid="'+IntToStr(i)+'"]');
      if (StrtoDate(lv_eintraege.Items[i].SubItems[1])=date)
      and (StrtoTime(lv_eintraege.Items[i].SubItems[2])= time)
      and (node=xmlDoc.selectSingleNode('/PlanView/termin[AlertShowed="''"]'))
      then begin
        ShowMessage('Ihr Termin ('+lv_eintraege.Items[i].SubItems[0]+') beginnt!');
        newTermin := xmldoc.createElement('termin');
        newSub := xmlDoc.createElement('AlertShowed');
        newSub.text :='x';
        newTermin.appendChild(newSub);
      end;
    end;
end;

alcaeus 8. Sep 2003 12:56

Re: ShowMessage OnTimer
 
Bist du sicher dass du Datum/Zeit in den Strings in den richtigen Formaten abgespeichert hast? Überprüfe mal in welcher Form StrToDate und StrToTime das Datum bzw. die Uhrzeit verlangen. Ansonsten sieht der Quelltext mal ganz ok aus...

CrashMan 8. Sep 2003 13:01

Re: ShowMessage OnTimer
 
Mach doch noch ein Boolean oder n Boolean-Array ...
If Boolean = false then begin sowmessage(); Boolean := true; end;

Akut-Programming 8. Sep 2003 13:07

Re: ShowMessage OnTimer
 
@alcaeus:

Naja, das Date wird im Format dd.mm.yyyy und die Uhrzeit im Format hh:mm:ss verlangt. Im File stehts auch so drin, also müsste er´s doch auch hinbekommen oder??

@CrashMan:

Ob ich nun n Boolean nehme, oder die zuweisung direkt in ne Variable mache un deren Wert dann überprüfe ist ja erstma egal denk ich. Nur siehts so aus, als ob er die Zuweisung anscheinend noch nichma hinbekommt.

Tpercon 8. Sep 2003 13:11

Re: ShowMessage OnTimer
 
Ich habe mich noch nie mit XML beschäftigt, aber mal so ins Blaue:
Delphi-Quellcode:
 node :=xmlDoc.selectSingleNode('/PlanView/termin[terminid="'+IntToStr(i)+'"]');
      if (StrtoDate(lv_eintraege.Items[i].SubItems[1])=date)
      and (StrtoTime(lv_eintraege.Items[i].SubItems[2])= time)
      and (node=xmlDoc.selectSingleNode('/PlanView/termin[AlertShowed="''"]'))
      then begin
Lass dir mal node und xmlDoc.selectSingleNode('/PlanView/termin[AlertShowed="''"]') ausgeben? Was steht drin?

Akut-Programming 8. Sep 2003 13:43

Re: ShowMessage OnTimer
 
Naja, also in xmlDoc.selectSingleNode('/PlanView/termin[AlertShowed="''"]') steht beim speichern des Termins '_'. Was dafür steht, das der Termin noch nich angezeigt wurde. Das überprüfe ich auch in meiner Schleife des Timers. Also wenn xmlDoc.selectSingleNode('/PlanView/termin[AlertShowed="_"]') ist, dann soll die Message angezeigt werden. Ist xmlDoc.selectSingleNode('/PlanView/termin[AlertShowed="x"]') soll sie nicht mehr angezeigt werden. Das 'x' setze ich in der Schleife des Timers, wenn der Termin "gemeldet" wurde.

Tpercon 8. Sep 2003 13:50

Re: ShowMessage OnTimer
 
Irgendwie will mir dieser Vergleich nicht ganz einleuchten:
Delphi-Quellcode:
(node=xmlDoc.selectSingleNode('/PlanView/termin[AlertShowed="''"]'))
Da kommt doch irgendwie garnichts vor, nach dem Motto = '_'?!
irgendwie sieht das für micht (XML Unwissender) so aus, als würdest du 2 Knoten miteinander vergleichen?

Akut-Programming 8. Sep 2003 13:58

Re: ShowMessage OnTimer
 
Hmm, ich glaub jetzt hast du mein Problem aufm Punkt gebracht! Ich will node eigentlich den Wert 'AlertShowed' des aktuellen Items (i) zuweisen und node dann abfragen. Nur da ich auch XML Neuling bin, stell ich es mir zu schwer vor, oder ich mach es mir zu schwer.

Ich weiß nicht, wie ich dem Prog sagen kann, das sich node aus dem gewählten item - davon den Wert 'AlertShowed' der sich in der XML Datei befindet, ergibt.

Tpercon 8. Sep 2003 14:06

Re: ShowMessage OnTimer
 
Wie kann ich denn den Wert des aktuellen IXMLDOMNode ausgeben? Mit Text oder?
Ich würde mal drauf tippen, das dein Vergleich wie folgt lauten muß:
Delphi-Quellcode:
if (StrtoDate(lv_eintraege.Items[i].SubItems[1])=date)
      and (StrtoTime(lv_eintraege.Items[i].SubItems[2])= time)
      and (xmlDoc.selectSingleNode('/PlanView/termin[AlertShowed="''"]').Text='_')
      then begin

CalganX 8. Sep 2003 14:12

Re: ShowMessage OnTimer
 
Hi,
das ist richtig, aber wird nicht funktionieren, weil ich vermute, dass die Node Termin keinen Text enthält. Ich denke, dass die XML-Datei so ungefähr aussieht:
Code:
<PlanView>
  <Termin>
    <AlertShowed>_</AlertShowed>
   
  </Termin>
</PlanView>
Wenn ich es also richtig verstehe, müsste das so aussehen:
Delphi-Quellcode:
if (StrtoDate(lv_eintraege.Items[i].SubItems[1])=date)
      and (StrtoTime(lv_eintraege.Items[i].SubItems[2])= time)
      and (xmlDoc.selectSingleNode('/PlanView/termin[id="' + IDDesTermins + '"]/AlertShowed').Text='_')
      then begin
Chris

PS: Anstatt id solltest du irgendein Kennmerkmal der Einträge verwenden (ich denke aber mal, dass du sowas wie eine ID verwendest).

Akut-Programming 8. Sep 2003 14:15

Re: ShowMessage OnTimer
 
Da bringt er mir, das es inkompatible Typen sind, is ja auch klar, XMLDomNode und WideString passen ja nich zusammen, daher versuchte ich ma noch es in ne String Variable zupacken, aber auch dat bleibt ohne Erfolg.

Tpercon 8. Sep 2003 14:15

Re: ShowMessage OnTimer
 
Zitat:

Zitat von Chakotay1308
das ist richtig, aber wird nicht funktionieren, weil...

Das es nicht copy & paste fähig ist, habe ich mir schon gedacht, schließlich habe ich noch nie etwas mit XML gemacht. Aber gut, dass die Richtung also stimmt. Denn die ursrünglich Methode ging ja rein logisch nicht.

Akut-Programming 8. Sep 2003 14:28

Re: ShowMessage OnTimer
 
Hey Chris, genau so meint ichs, nur das ich jetzt ne Zugriffsverletzung bekomme, wenn er das Datum überprüft.

Delphi-Quellcode:
begin
    for i:=0 to lv_eintraege.Items.Count -1 do begin
    if (StrtoDate(lv_eintraege.Items[i].SubItems[1])=date) //Hier kommt er in die Zugriffsverletzung
      and (StrtoTime(lv_eintraege.Items[i].SubItems[2])=time)
      and (xmlDoc.selectSingleNode('/PlanView/termin[id="'+IntToStr(i)+'"]/AlertShowed').Text='_')
      then begin
        ShowMessage('Ihr Termin ('+lv_eintraege.Items[i].SubItems[1]+') beginnt!');
        newTermin := xmldoc.createElement('termin');
        newSub := xmlDoc.createElement('AlertShowed');
        newSub.text :='x';
        newTermin.appendChild(newSub);
      end;
    end;
Man, es ist zum :kotz: . Es kann doch nich so schwer sein, ne Meldung nach n paar Kriterien anzuzeigen.

Tpercon 8. Sep 2003 14:31

Re: ShowMessage OnTimer
 
Und wie lautet der Text der Exception?

Akut-Programming 8. Sep 2003 14:36

Re: ShowMessage OnTimer
 
...ist eine Exception der Klasse EAccessViolation aufgetreten..
Oder wat meinste? :lol:

Tpercon 8. Sep 2003 14:39

Re: ShowMessage OnTimer
 
Hm, eigentlich kann da nur irgendwas wie ... ist kein gültiges Datum kommen.:gruebel:

Akut-Programming 8. Sep 2003 14:48

Re: ShowMessage OnTimer
 
Ne, kommt net! Der geht in die Zeile
Delphi-Quellcode:
...
if (StrtoDate(lv_eintraege.Items[i].SubItems[1])=date)
...
in dieser kommt er nich weiter, un geht wieder in die Zeile
Delphi-Quellcode:
...
for i:=0 to lv_eintraege.Items.Count do begin
...
Muss ich noch irgendwelche Operatoren beachten?

Tpercon 8. Sep 2003 14:51

Re: ShowMessage OnTimer
 
Ich hoffe die Zeile
Delphi-Quellcode:
for i:=1 to lv_eintraege.Items.Count do begin
heißt bei dir
Delphi-Quellcode:
for i := 0 to lv_eintraege.Items.Count - 1 do begin
Das er wieder zur Schleife springt ist klar, da das Datum nicht identisch sein wird. Was ja auch so sein soll.

Akut-Programming 8. Sep 2003 14:59

Re: ShowMessage OnTimer
 
Ja hab die Zeile so!
Delphi-Quellcode:
for i := 0 to lv_eintraege.Items.Count - 1 do begin
War nur n Schreibfehler...

Akut-Programming 9. Sep 2003 06:45

Re: ShowMessage OnTimer
 
Mit meinem Problem hat´se aber ehr nichts zu tun! :cry:

Tpercon 9. Sep 2003 07:49

Re: ShowMessage OnTimer
 
Poste nochmal deinen jetzigen Code!

Akut-Programming 9. Sep 2003 08:16

Re: ShowMessage OnTimer
 
Hi Tpercon!! :wink:

Hier der Code vom Timer:

Delphi-Quellcode:
procedure Tfrm_terminplaner_main.Timer2Timer(Sender: TObject);
var
  i: integer;
  node: IXMLDOMNode;
  newTermin, newSub: IXMLDOMNode;
begin
    for i:=0 to lv_eintraege.Items.Count - 1 do begin
    //node :=xmlDoc.selectSingleNode('/PlanView/termin[terminid="'+IntToStr(i)+'"]');
      if (StrtoDate(lv_eintraege.Items[i].SubItems[1])=date)
      and (StrtoTime(lv_eintraege.Items[i].SubItems[2])=time)
      and (xmlDoc.selectSingleNode('/PlanView/termin[id="'+IntToStr(i)+'"]/AlertShowed').Text='_')
      then begin
        ShowMessage('Ihr Termin ('+lv_eintraege.Items[i].SubItems[1]+') beginnt!');
        newTermin := xmldoc.createElement('termin');
        newSub := xmlDoc.createElement('AlertShowed');
        newSub.text :='x';
        newTermin.appendChild(newSub);
      end;
    end;
end;
Und hier ma noch der Code vom speichern eines Termins...

Delphi-Quellcode:
procedure Tfrm_terminplaner_main.bn_speichernClick(Sender: TObject);
var
   newTermin, newSub: IXMLDOMNode;
begin
  if DateToStr(cb_von_datum.Date)>= DateToStr(now)
  then begin
    if (ed_terminbez.Text='')
    then begin
      ShowMessage('Bitte geben Sie eine Terminbezeichnung ein');
      exit;
    end;
      newTermin := xmldoc.createElement('termin');
      newSub := xmldoc.createElement('terminid');
      newSub.text := IntToStr(frm_terminplaner_main.lv_eintraege.Items.Count + 1);
      newTermin.appendChild(newSub);

      newSub := xmlDoc.createElement('terminbez');
      newSub.text := ed_terminbez.Text;
      newTermin.appendChild(newSub);

      newSub := xmlDoc.createElement('datum');
      newSub.text :=DateToStr(cb_von_datum.Date);
      newTermin.appendChild(newSub);

      newSub := xmlDoc.createElement('uhrzeit');
      newSub.text := ed_von_uhrzeit.Text;
      newTermin.appendChild(newSub);

      newSub := xmlDoc.createElement('bemerkung');
      newSub.text := ed_bemerkung.Text;
      newTermin.appendChild(newSub);

      newSub := xmlDoc.createElement('AlertShowed');
      newSub.text := '_';
      newTermin.appendChild(newSub);

      xmlDoc.documentElement.appendChild(newTermin);
      xmlDoc.save(frm_terminplaner_main.instpath + xmlfilename);

      StatusBar1.Panels[2].Text:='Ihr Termin ('+ed_terminbez.Text+') wurde erfolgreich gespeichert!       ';
      Timer1.Enabled:=true;
      cb_von_datum.Date:=now;
      ed_terminbez.Clear;
      ed_bemerkung.Clear;
      ed_von_uhrzeit.Text:=TimeToStr(now);
      frm_terminplaner_main.UpdateList;
      FocusControl(lv_eintraege);
      Label1.Caption:='erfasste Termine ('+IntToStr(lv_eintraege.Items.Count)+')';
  end else
  ShowMessage('Das ausgewählte Datum liegt in der Vergangenheit! Bitte ändern Sie ihre Eingabe');
end;
Gruß,

Tpercon 9. Sep 2003 08:24

Re: ShowMessage OnTimer
 
Was ich wohl nicht so ganz verstehe, ist, dass du da
Delphi-Quellcode:
   if (StrtoDate(lv_eintraege.Items[i].SubItems[1])=date)
und da
Delphi-Quellcode:
 ShowMessage('Ihr Termin ('+lv_eintraege.Items[i].SubItems[1]+') beginnt!');
auf das SubItem[1] verweist?! Im Vergleich wird da nen Datum erwartet und in der Message würde ich sinngemäß einen Text erwarten.

Akut-Programming 9. Sep 2003 08:47

Re: ShowMessage OnTimer
 
Naja also die Zeile für die Message muss so aussehen..

Delphi-Quellcode:
ShowMessage('Ihr Termin ('+lv_eintraege.Items[i].SubItems[0]+') beginnt!');
Aber das is ja erstma egal, da so oder so keine Message kommt. :cry:

Tpercon 9. Sep 2003 08:50

Re: ShowMessage OnTimer
 
Kommt jetzt weiterhin irgendwo zur Laufzeit ne Fehlermeldung oder kommt einfach keine Message?

Akut-Programming 9. Sep 2003 09:05

Re: ShowMessage OnTimer
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ne kommt keine Fehlermeldung! Aber Das Datum is auch korrekt drin. :wall: Man es kann doch nich sein... :? Hier is ma n Screenshot meiner XML Datei.

CalganX 9. Sep 2003 10:19

Re: ShowMessage OnTimer
 
Hi,
in der Zeile
Delphi-Quellcode:
 and (xmlDoc.selectSingleNode('/PlanView/termin[id="'+IntToStr(i)+'"]/AlertShowed').Text='_')
muss es wohl
Delphi-Quellcode:
 and (xmlDoc.selectSingleNode('/PlanView/termin[terminid="'+IntToStr(i)+'"]/AlertShowed').Text='_')
Schau dir mal diese beiden Zeilen + die Fehlerzeile + die XML-Datei an. Dann würdest du sogar selber draufkommen. :roll:

Chris

Akut-Programming 9. Sep 2003 10:30

Re: ShowMessage OnTimer
 
:wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall:

F**K!! Jetzt klappts. Stimmt, die heißt bei mir ja nich einfach id, sondern terminid. Nur, das er mir dann kein 'x' in AlertShowed einträgt, wenn er die Meldung bringt. Daher kommt die Meldung jede Sekunde in ner Minute. Is da mein Code richtig so?? :oops:

Delphi-Quellcode:
procedure Tfrm_terminplaner_main.Timer2Timer(Sender: TObject);
var
  i: integer;
  node: IXMLDOMNode;
  newTermin, newSub: IXMLDOMNode;
begin
...
      then begin
        ShowMessage('Ihr Termin ('+lv_eintraege.Items[i].SubItems[0]+') beginnt!');
        newTermin := xmldoc.createElement('termin');
        newSub := xmlDoc.createElement('AlertShowed');
        newSub.text :='x';
        newTermin.appendChild(newSub);
      end;
...
end;

CalganX 9. Sep 2003 10:37

Re: ShowMessage OnTimer
 
Neue Frage -> Neuer Thread, aber weil ich heute mal freundlich bin:

Nein. Damit hängst du an. Ich dachte, du hast das Tutorial gelesen!? Du musst einfach nur auf die Eigenschaft Text zugreifen und speichern. Nicht irgendwie neuanhängen oder so!

Chris

Akut-Programming 9. Sep 2003 10:46

Re: ShowMessage OnTimer
 
Ja, :wall: habs auch grad auf meinem 'Edit' Form gefunden! :lol:

Man man, ihr hier seid echt klasse. :spin: THX
:dp:


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