| Autor |
Beitrag |
pentaxfan2
Hält's aus hier
Beiträge: 7
|
Verfasst: Di 05.10.10 16:55
Hi,
ich bin absoluter Deplhi Anfänger und würde gerne eine Programm schreiben, mit dem ich die Wartezeiten von Blutspendern kontrollieren kann.
Dh: Jemand kommt zu mir, Blut wird abgenommen, ich trage ihn mit seinem Namen in das Programm ein, der Name erscheint in einer Liste, nach 10 Minuten verschwindet der Name aus der Liste.
Mein Problem ist, dass der Timer nicht funktioniert und ich nicht weiß, wie ich mit einem Editfeld und einem Button Namen in eine Liste eintragen kann. Bitte helft mit!
danke im Vorraus
Moderiert von Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.Moderiert von Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 05.10.2010 um 17:14
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 05.10.10 17:03
Hallo und
pentaxfan2 hat folgendes geschrieben : | | Mein Problem ist, dass der Timer nicht funktioniert |
Inwiefern?
Was hast du denn schon?
|
|
pentaxfan2 
Hält's aus hier
Beiträge: 7
|
Verfasst: Di 05.10.10 17:36
des hab ich ausm forum entnommen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.FormCreate(Sender: TObject); begin timer1.Enabled:=false; end;
procedure TForm1.Button1Click(Sender: TObject); begin timer1.Interval:=10000; timer1.Enabled :=true; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin timer1.Enabled:=false; end; |
ich hab bisher nur ein bisschen herumgespielt und das Programm noch nicht richtig aufgebaut.
Moderiert von Kha: Delphi-Tags hinzugefügt
Zuletzt bearbeitet von pentaxfan2 am Di 05.10.10 19:02, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 05.10.10 17:43
Dann überlege dir doch zuerst einmal wie du das auf dem Papier lösen würdest. Ganz genau, Schritt für Schritt.
Außerdem:
Ist dir denn klar wie ein Timer prinzipiell funktioniert?
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Di 05.10.10 17:59
Interval von 10000 ms = 10 Sekunden <> 10 Minuten
|
|
pentaxfan2 
Hält's aus hier
Beiträge: 7
|
Verfasst: Di 05.10.10 18:03
mein problem ist, dass nach ablauf des timers die aktion die dann folgen soll (also die Löschung des namens)
nicht ausgeführt wird.
mein zweites problem ist, dass ich nicht weiß, wie ich mehrere namen in eine liste schreiben kann, ohne mehrere buttons zu haben... (aber das ist vorerst nicht soo wichtig)
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 05.10.10 18:09
Hi, na da hast Du doch schon ein Stichwort selbst genannt, Stringlist + anzeigen mit Memo.
Was den Timer betrifft solltest Du überlegen ob der Timer für den Spender da sein soll, oder zum Vergleich der Zeiten, wann du den Spender eingetragen hast in der Liste?
Und für das Eintragen in der Stringlist reicht ein EditFeld und ein Button
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
pentaxfan2 
Hält's aus hier
Beiträge: 7
|
Verfasst: Di 05.10.10 18:56
der Timer soll dazu da sein, zu zeigen, wer noch warten muss. nach der spende müssen 10min Pause eingelegt werden.
also der spender muss davon nichts sehen, ist nur für das spendensammelteam, damit die bescheidwissen, wenn ein spender weggehen kann.
ich erklär mal wie des programm aussehen soll:
oben: eingabefeld wo man den namen einträgt und ein button, damit der name unten in der liste eingetragen wird.
unten: liste, auf der die Spender geordnet stehen. wenn ein spender seine 10min überstanden hat, wird dieser automatisch von der liste gelöscht.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 05.10.10 19:29
Dann würd ich einfach alle 5 sek. ca. in ner internen liste verwalten ob der oberste in der Liste gehen kann. diese interne liste würde ich dann grafisch an eine TListbox koppeln die dann die namen ausgibt.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
pentaxfan2 
Hält's aus hier
Beiträge: 7
|
Verfasst: Di 05.10.10 19:44
also fast alle probleme gelöst:
mit ner memo werden die namen in die liste eingetragen.
mein einziges problem ist, dass nach ablauf der zeit des timers die aktion, den namen zu löschen
nicht ausgeführt wird ( ich habe es auch mit anderen bsps ausprobiert, also es liegt nicht daran, dass
die aktion nen fehler hat) .
nochmal verständlich  :
Wenn der timer abgelaufen ist passiert nichts mehr!
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 05.10.10 19:45
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 05.10.10 19:52
vielleicht hilft dir das hier weiter:
Christians Crashkurs
Delphi-Wikibook
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
pentaxfan2 
Hält's aus hier
Beiträge: 7
|
Verfasst: Di 05.10.10 19:53
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:
| implementation
{$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); var i: integer; begin timer1.Enabled:=false; for i := Memo1.Lines.Count - 1 downto 0 do begin if (Memo1.Lines[i] = '<not found>') then begin Memo1.Lines.Delete(i); end; end;
end;
function liesperson:Tperson; begin result.name:= form1.edit1.Text; end;
procedure schreibperson(person:Tperson); var Timer1: TTimer; begin form1.Memo1.lines.add(person.name); end;
procedure TForm1.Button1Click(Sender: TObject); var person: TPerson; begin person := liesperson; schreibperson(Person); Timer1.Enabled :=true; timer1.Interval:=10000; Timer1Timer(Sender); end; |
ich hab noch nen bisschen dran rumgespielt, also einige sachen sind an orten, an die sie nicht gehören 
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 05.10.10 20:17
Warum so umständlich
TPerson ist was?
Für was ist dies?
Delphi-Quelltext 1: 2:
| procedure schreibperson(person:Tperson); var Timer1: TTimer; |
pentaxfan2 hat folgendes geschrieben : | mein einziges problem ist, dass nach ablauf der zeit des timers die aktion, den namen zu löschen
nicht ausgeführt wird ( ich habe es auch mit anderen bsps ausprobiert, also es liegt nicht daran, dass
die aktion nen fehler hat) . |
Weil Du den Timer stopst befor die Schleife durchlaufen ist.
Richtig müsste es so sein
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Timer1Timer(Sender: TObject); var i: integer; begin for i := Memo1.Lines.Count - 1 downto 0 do begin if (Memo1.Lines[i] = '<not found>') then begin Memo1.Lines.Delete(i); timer1.Enabled:=false; end; end; end; |
Würde Dir aber trotzdem empfehlen die einzelnen Antworten mal durchzulesen!
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
pentaxfan2 
Hält's aus hier
Beiträge: 7
|
Verfasst: Di 05.10.10 20:23
wie schon gesagt, ich bin absoluter anfänger und verstehe vieles nicht
@Alf: ich habe den Code geändert, aber es klappt immernoch nicht....
|
|
Georg08
      
Beiträge: 155
Erhaltene Danke: 6
Win XP
Delphi 7.0 Personal
|
Verfasst: Di 05.10.10 20:23
ALF hat folgendes geschrieben : |
[...]
TPerson ist was?
[...] |
Frage ich mich auch gerade
Und wenn du das so macht müsstest du doch entweder für jeden User einen Teimer erstellen (nich gut  )
oder für jeden User ine Zeit speichern, und diese dann mit einem Timer abfragen, aber in kleineren intervallen 
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Di 05.10.10 20:47
Wichtiger Tipp hat Dir elundril gegeben und von mir gibts auch noch einen!
Wenn etwas im Prog nicht funktioniert, ein Haltepunkt setzen und mit F7 oder F8 durchsteppen was das Prog macht bzw nicht macht! So erkennt man ganz schnell die einfachsten Fehler
Z.B. Ob Variablen richtig gesetzt sind, das Prog auch dahin springt wo es soll usw.
Hilft manchmal mehr als tausend Antworten die man evtl nicht versteht!
Denn ich frage mich auch, was dies soll?
Delphi-Quelltext sobald Du den Timer1.enabled:=true setzt wird er gestartet. Ein zusätzlicher Aufruf ist nicht notwendig.
Ansonsten frag ich mich jetzt auch, ob ich Dir was falsches schreibe, wenn es trotzdem nicht funktioniert
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
bole
      
Beiträge: 107
Erhaltene Danke: 15
win 10
|
Verfasst: Di 05.10.10 21:04
ALF hat geschrieben | Zitat: | | Weil Du den Timer stopst befor die Schleife durchlaufen ist. |
Da bin ich anderer Meinung. Wenn Du timer.enabled:=false setzt wird beim nächsten ablauf des Intervalls keine TimerEvent mehr ausgelöst. Die bereits gestartete Procedure wird aber fertig druchlaufen.
Meines Erachtens ist der Ablauf wie Georg08 vorzuziehen.
- Bei der Person den Eintragszeitpunkt speichern
- bei einem Timerevent die Liste durchgehen ob ein Eintrag länder als 10 min in der Liste steht.
Gruss
Bole
_________________ ein programm macht nicht das was du willst sondern was du schreibst!
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mi 06.10.10 09:36
bole hat folgendes geschrieben : | | Die bereits gestartete Procedure wird aber fertig druchlaufen. |
Jo, hast Du natürlich recht.
Da ich ihm also schon was falsches gesagt habe, werd ich ihm mal ein kleines Beispiel zur Anregung geben.
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:
| ..... ..... Private kunde: TStringlist; goTime: TTime; ..... ..... procedure TForm1.FormCreate(Sender: TObject); begin kunde:= TStringList.Create; goTime:= StrToTime('00:01:00'); Memo1.Clear; Edit1.Text:= ''; end; procedure TForm1.Button1Click(Sender: TObject); begin if Edit1.Text= '' then exit; kunde.Add(Edit1.Text+' '+TimeToStr(Now)+'='+ TimeToStr(Now+goTime)); Memo1.Lines.Add(Edit1.Text+' '+TimeToStr(Now)+'='+ TimeToStr(Now+goTime)); Edit1.Text:= ''; end; procedure TForm1.Timer1Timer(Sender: TObject); var i: integer; istTime: TTime; kundenTime: TTime; begin istTime:= Time; for i:= 0 to kunde.Count - 1 do begin kundenTime:= StrtoTime(kunde.ValueFromIndex[i]); if istTime >= kundenTime then begin kunde.Delete(i); Memo1.Clear; Memo1.Lines.AddStrings(kunde); break; end; end; end; |
Was Du pentaxfan2 daraus machst, also einfach die Liste automatisch löschen, ohne Kontrolle ob der Delinquent auch wirklich geht, bescheid bekommt, find ich persöhnlich nicht sehr schön. Aber über Geschmack lässt sich wahrlich streiten
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Zuletzt bearbeitet von ALF am Mi 06.10.10 11:42, insgesamt 1-mal bearbeitet
|
|
bole
      
Beiträge: 107
Erhaltene Danke: 15
win 10
|
Verfasst: Mi 06.10.10 11:18
Was mit einem Eintrag der 10 Minuten alt ist zu geschehen hat, habe ich nicht definiert...
Ich bin da Deiner Meinung das man den Eintrag nicht einfach löschen soll. Dieser sollte markiert werden und bestätigt werden.
Gruss
Bole
_________________ ein programm macht nicht das was du willst sondern was du schreibst!
|
|