Entwickler-Ecke
Sonstiges (Delphi) - Blutspendeprogramm
pentaxfan2 - Di 05.10.10 16:55
Titel: Blutspendeprogramm
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 - Di 05.10.10 17:03
Hallo und :welcome:
pentaxfan2 hat folgendes geschrieben : |
| Mein Problem ist, dass der Timer nicht funktioniert |
Inwiefern?
Was hast du denn schon?
pentaxfan2 - 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
jaenicke - 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 - Di 05.10.10 17:59
Interval von 10000 ms = 10 Sekunden <> 10 Minuten
pentaxfan2 - 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 - 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 :wink:
Gruss Alf
pentaxfan2 - 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 - 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
pentaxfan2 - 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 :D :
Wenn der timer abgelaufen ist passiert nichts mehr!
ALF - Di 05.10.10 19:45
pentaxfan2 hat folgendes geschrieben : |
| wenn ein spender seine 10min überstanden hat, wird dieser automatisch von der liste gelöscht. |
wobei ich dies etwas gewagt halte. Lieber ne Anzeige(farblich) das der Delinquent gehen kann und bestätigen. Vorteil, sollte man mal nicht am PC gewesen sein so sieht man, das da jemand noch rumsitz und nicht Feierabendmacht nur weil die Liste leer ist :mrgreen:
Wie nun Dein Prog sein soll und was es alles kann, sei Dir überlassen :wink:
Einfach loslegen(mit Überlegung) und wenn was nicht klappt, so wird ihnen geholfen 8)
Gruss Alf
Moderiert von
Gausi: Beiträge zusammengefasst.
pentaxfan2 hat folgendes geschrieben : |
| Wenn der timer abgelaufen ist passiert nichts mehr! |
Dann solltest du den Code Posten nur so können wir Deinen Fehler sehen :wink:
Gruss Alf
pentaxfan2 - Di 05.10.10 19:53
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:
| 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 :D
ALF - Di 05.10.10 20:17
Warum so umständlich :gruebel:
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
pentaxfan2 - Di 05.10.10 20:23
wie schon gesagt, ich bin absoluter anfänger und verstehe vieles nicht :D
@Alf: ich habe den Code geändert, aber es klappt immernoch nicht....
Georg08 - Di 05.10.10 20:23
ALF hat folgendes geschrieben : |
[...]
TPerson ist was?
[...] |
Frage ich mich auch gerade :D
Und wenn du das so macht müsstest du doch entweder für jeden User einen Teimer erstellen (nich gut :D )
oder für jeden User ine Zeit speichern, und diese dann mit einem Timer abfragen, aber in kleineren intervallen ;-)
ALF - 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 :wink:
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?
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 :gruebel:
Gruss ALf
bole - 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
ALF - 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.
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:
| ..... ..... 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 :mrgreen:
Gruss Alf
bole - Mi 06.10.10 11:18
Was mit einem Eintrag der 10 Minuten alt ist zu geschehen hat, habe ich nicht definiert... :mrgreen:
Ich bin da Deiner Meinung das man den Eintrag nicht einfach löschen soll. Dieser sollte markiert werden und bestätigt werden.
Gruss
Bole
ALF - Mi 06.10.10 11:45
Sorry
bole :oops: Ich meinte natürlich
pentaxfan2 was das automatische Löschen betrifft
Finde ich ebenfalls als keine gute Idee!
Gruss
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!