Autor |
Beitrag |
Solid Snake
      
Beiträge: 44
Win XP Prof, Suse Linux 9 Prof
D7 Enterprise
|
Verfasst: Do 07.04.05 02:46
Zitat: | Wenn ich mir das heute so angucke denke ich eigentlich, dass man das am Besten alles nochmal programmieren sollte |
Toll um den Chat komplett selbst zu Programmieren fehlen mir leider doch noch ein paar Delphi kentnisse
Zitat: | Ich hab mir damals ja nichtmal die Mühe gemacht, Buttons zu benennen... |
Kein Problem! Ich habe das noch gemacht
Arbeitest du jetzt dann noch weiter an dem Chat oder bin ich ab jetzt auf mich alleine gestellt?
Ich hoffe du arbeitest da noch etwas weiter dran!
mfg
Solid Snake
_________________ Wenn der Computer mit 0100101001010 Arbeitet ist ok,
aber wenn er mit 110 anfängt mach ich ihn kaputt!
|
|
Andi1982
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: Do 07.04.05 07:12
Wir hatten damals auch das Problem dass das ding dauernd abgestürzt ist, vorallem wenn mehrere gleichzeitig abgedrückt haben...
am besten wäre es echt das ding nochmal neu zu schreiben...
Aber hat uns trotzdem jede menge spass gebrach 
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|
ObscurusNox 
      
Beiträge: 49
|
Verfasst: Do 07.04.05 22:39
Solid Snake hat folgendes geschrieben: | Arbeitest du jetzt dann noch weiter an dem Chat oder bin ich ab jetzt auf mich alleine gestellt? |
Also ehrlich gesagt war das Projekt schon abgeschlossen, als ich's hier gepostet hab. Bin da also auch nicht mehr so wirklich drin, was ich damals fabriziert hab. Das Grundprinzip ist noch klar, aber was die Details angeht...
Solid Snake hat folgendes geschrieben: | Toll um den Chat komplett selbst zu Programmieren fehlen mir leider doch noch ein paar Delphi kentnisse |
Das ist aber eigentlich gar nicht sooo kompliziert. Ich würde diesmal auch die Kommunikation über TCP/IP bevorzugen, also die Client- & ServerSocket Komponenten benutzen. Oder man muss sich für das bisherige System nochmal etwas mit der Datei-Verwaltung auseinander setzen.
Kann ja nicht sein, dass ein Windows-Programm die ganze Zeit an der Rechenpower zieht, nur um 1000 mal zu versuchen eine Datei zu öffnen. Da gibt's bestimmt elegantere Möglichkeiten.
Eine spontane Idee wäre, dass jeder User in seine eigenen Datei schreibt und jeder alle Dateien ausließt, dann gäb's die Schreib-Probleme nicht. Allerdings müsste man dann nach dem auslesen alles in die richtige Reihenfolge sortieren...
Wäre natürlich bereit dabei zu helfen das Ding neu zu gestalten, wenn es Vorstellungen gibt was bei rauskommen soll.
Was meint ihr???
|
|
Solid Snake
      
Beiträge: 44
Win XP Prof, Suse Linux 9 Prof
D7 Enterprise
|
Verfasst: Di 12.04.05 15:39
Zitat: | Ich würde diesmal auch die Kommunikation über TCP/IP bevorzugen, also die Client- & ServerSocket Komponenten benutzen. |
Die bessere lösung währe das auf jeden fall! Aber eigentlich bin ich mit dem Chat so ganz zufrieden bis auf die Abstürtze
Da ich den Chat in der Schule benutze und das Jahr ja nicht mehr so lange geht wollte ich eigentlich nicht bei 0 anfangen und alles neu Programieren!
Zitat: | Wäre natürlich bereit dabei zu helfen das Ding neu zu gestalten, wenn es Vorstellungen gibt was bei rauskommen soll. |
Den Chat habe ich ja soweit an meine bedürfnisse angepasst! Klappt auch alles Wunderbar! Nur das Problem ist halt immernoch das der Chat manchmal Abstürtzt!
Auf der Ersten Seite hattest du ja eine eventuelle lösung für das Problem gepostet doch die funktioniert irgendwie nicht so richtig
Ich habe leider keine ideen mehr wie man das Problem mit den Abstürtzen lösen könnte!
Für etwas hilfe oder sogar ein paar Code Schnipsel währe ich sehr dankbar!
_________________ Wenn der Computer mit 0100101001010 Arbeitet ist ok,
aber wenn er mit 110 anfängt mach ich ihn kaputt!
|
|
ObscurusNox 
      
Beiträge: 49
|
Verfasst: Di 12.04.05 17:36
Ich nehme an, dass folgender Code das Problem verursacht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button1Click(Sender: TObject); var i : Integer; begin IF (Length( Edit2.Text ) > 0) AND (Length( Edit2.Text ) < 255) THEN BEGIN DeleteFile( Dateipfad+'temp.tmp' ); Bool := False; REPEAT {$I-} Bool := RenameFile( Dateiname, Dateipfad+'temp.tmp' ); {$I+} UNTIL (IoResult = 0) AND Bool; AssignFile( Datei, Dateipfad+'temp.tmp' ); Reset( Datei ); [...] |
Button1 ist der "Abschicken"-Button, mit dem eine Nachricht verschickt wird.
Daraufhin versucht das Programm das normale Datei zu finde (die nur da ist, wenn nicht grad ein anderer schreibt) und in temp.tmp umzubenennen, um dann reinzuschreiben und sie wieder zurück zu benennen.
Ich hab's zwar nicht getestet, aber ich denke, dass die Repeat-Until-Schleife ein Problem darstellt. Ich weiß zwar nicht wirklich wie lange so ein Schreibvorgang dauert (Datei umbenennen, reinschreiben, zurück benennen), aber ich denke die Schleife wird da schon so einige Male durchlaufen.
Vielleicht sind aber auch die {$I-} und {$I+} das Problem. Diese bewirken, dass kein Error erscheint, falls die Datei nicht vorhanden ist (funktioniert auch für Reset( Datei )).
Du könntest also versucht, diese ganze Abfrage mit einem TTimer zu kombinieren. Beispiel:
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: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80:
| procedure TForm1.Timer1Timer(Sender: TObject); begin IF (Length( Edit2.Text ) = 0) or (Length( Edit2.Text ) > 254) THEN BEGIN Messagedlg( 'Sie müssen zwischen 1 und 255 Zeichen eingeben !!!', mterror, [mbok], 0 ); Timer1.Enabled := False; Edit2.SetFocus; END else if FileExists( Dateiname ) then begin DeleteFile( Dateipfad+'temp.tmp' ); RenameFile( Dateiname, Dateipfad+'temp.tmp' ); Timer1.Enabled := False; Abschicken; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled := True; end;
procedure Abschicken; begin AssignFile( Datei, Dateipfad+'temp.tmp' ); Reset( Datei ); Inc( DsxDatei.LastInput ); IF DsxDatei.LastInput > 15 THEN BEGIN FOR i := 2 TO 15 DO BEGIN DsxDatei.Inputs[ i-1 ] := DsxDatei.Inputs[ i ]; END; DecodeTime( Time, Hour, Min, Sek, Sek100 ); Str( Hour, StrHour ); IF Hour < 10 THEN StrHour := '0' + StrHour; Str( Min, StrMin ); IF Min < 10 THEN StrMin := '0' + StrMin; DsxDatei.Inputs[ 15 ].User := EnCode( UserName ); DsxDatei.Inputs[ 15 ].Time := EnCode( StrHour + ':' + StrMin ); DsxDatei.Inputs[ 15 ].Comment := EnCode( Edit2.Text ); DsxDatei.LastInput := 15; END ELSE BEGIN DecodeTime( Time, Hour, Min, Sek, Sek100 ); Str( Hour, StrHour ); IF Hour < 10 THEN StrHour := '0' + StrHour; Str( Min, StrMin ); IF Min < 10 THEN StrMin := '0' + StrMin; DsxDatei.Inputs[ DsxDatei.LastInput ].User := EnCode( UserName ); DsxDatei.Inputs[ DsxDatei.LastInput ].Time := EnCode( StrHour + ':' + StrMin ); DsxDatei.Inputs[ DsxDatei.LastInput ].Comment := EnCode( Edit2.Text ); END;
Rewrite( Datei ); Write( Datei, DsxDatei ); CloseFile( Datei ); ListBox1.Items.Clear; FOR i := 1 TO 20 DO BEGIN IF DsxDatei.UserName[ i ] <> '' THEN BEGIN ListBox1.Items.Add( DeCode( DsxDatei.UserName[ i ] ) ); END; END; Memo1.Clear; FOR i := 1 TO DsxDatei.LastInput DO BEGIN Memo1.Lines.Add( DeCode( DsxDatei.Inputs[ i ].User ) + ' (' + DeCode( DsxDatei.Inputs[ i ].Time ) + '): ' + DeCode( DsxDatei.Inputs[ i ].Comment ) ); END; RenameFile( Dateipfad+'temp.tmp', Dateiname ); Alter := FileAge( Dateiname ); Edit2.Text := ''; Edit2.SetFocus; end; |
Dann stellste den TTimer auf 100ms oder sowas. Dann versucht er noch 10x pro Sekunde die Datei zu finden. Wenn er sie gefunden hat, benennt er sie sofort um (damit kein anderer reinschreiben kann) und führt dann alles aus, was vorher nach der problematischen Repeat-Until-Schleife kam.
Zusätzlich könntest du noch was optische einbauen, dass man den Versuch des Absendens sieht. Z.B. eine TStatusBar, die immer mehr Punkte kriegt "........................." oder sowas.
Hab's nicht getestet, dürfte aber einen Versuch wert sein. Probier's mal aus.
|
|
Solid Snake
      
Beiträge: 44
Win XP Prof, Suse Linux 9 Prof
D7 Enterprise
|
Verfasst: Di 19.04.05 18:48
@ ObscurusNox
erstmal danke das du so schnell geantwortet hast!
Deine idee die du da hast sollte eigentlich Funktionieren! In der theorie macht es aufjedenfall schonmal mehr sinn als der alte Code!
Ich habe probiert den "neuen" Code einzubauen doch der Compiler bombadiert mich förmlich mit Fehlern!
Ich bekomme z.b. die Meldung:
Undifinierter Bezeichner: 'Edit_Message'
Edit Message ist bei mir das Edit Feld in dem die Nachricht eingegeben wird! Bei dir war das glaube Edit2!
Die gleiche Fehlermeldung bekomme ich noch bei dem Memo wo die ganzen nachrichten drin sind und bei der ListBox der User!
Wo dran kann das liegen??
Ich komme irgendwie nicht mehr weiter 
_________________ Wenn der Computer mit 0100101001010 Arbeitet ist ok,
aber wenn er mit 110 anfängt mach ich ihn kaputt!
|
|
ObscurusNox 
      
Beiträge: 49
|
Verfasst: Di 19.04.05 19:54
Nehme mal an du hast für die bessere Übersicht die ganzen Objekte sinnvoll benannt. Bei mir sind die ja, wie Delphi sie benannt hat.
Hierzu sind die in meinem Code verwendeten Bezeichner gut:
Edit2: Eingabe-Feld für den zu sendenden Text
Timer1: wäre der neue Timer
ListBox1: Userliste
Memo1: Chatroom-Text
Mehr hab ich grad nicht gefunden.
Hoffe das löst deine Probleme. Musst die jetzt halt so benennen, wie sich bei dir heißen. Dazu kann ich die "Ersetzen" Funktion empfehlen. Weiß nicht ob du die kennst:
Strg+R (Replace) öffnet ein Dialogfenster zum Ersetzen von Text.
Oder Dateimenü: Search -> Replace (eng.) / Suchen -> Ersetzen (dt.)
MfG,
Markus.
|
|
Solid Snake
      
Beiträge: 44
Win XP Prof, Suse Linux 9 Prof
D7 Enterprise
|
Verfasst: Di 19.04.05 20:18
Ich habe sie ja entsprechend umbenannt!
Doch jetzt bekomme ich ja den Fehler!
Deswegen finde ich das irgendwie seltsam!
_________________ Wenn der Computer mit 0100101001010 Arbeitet ist ok,
aber wenn er mit 110 anfängt mach ich ihn kaputt!
|
|
Andi1982
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: Mi 20.04.05 06:42
Hi,
such doch einfach mal in deinem Code nach Edit_Message und schau was der da macht mit dem Feld! Wenn du dir nicht sicher bist kannst du die stelle ja posten...
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|
Solid Snake
      
Beiträge: 44
Win XP Prof, Suse Linux 9 Prof
D7 Enterprise
|
Verfasst: Mi 27.04.05 17:07
So hab es geschafft! War ein dummer Fehler!
Ich hatte die Procedure "Abschicken" oben in der Prozedureliste <-- (hat die einen extra namen??) folgendermassen eingetragen:
procedure Abschicken;
Was auch richtig war nur die eigentliche Procedure musste nicht
Delphi-Quelltext 1: 2:
| procedure Abschicken; begin |
sondern
Delphi-Quelltext 1: 2: 3:
| procedure TMainForm.Abschicken(); var i : Integer; begin |
lauten!
Und jetzt funktioniert es auch wunderbar!
Muss es aber noch im härtetest mit vielen leuten ausprobieren!
Sollte aber eigentlich jetzt kein Problem mehr sein!
Aber eine Frage hätte ich da noch
Kann man irgendwie die .DSX datei schützen?
Also das nur der Chat Schreib - und Leserechte hat und man die Datei solange noch einer im Chat ist nicht von Hand löschen kann!
Desweiteren sollte man die Datei auch nicht mit dem "Editor" oder sonstwas öffnen können um was zu verändern und die Datei dann wieder zu speichern!
Wenn die Datei dann noch mit dem Attribut "Versteckt" sein würde, währe es ein absoluter traum!
Kann man sowas irgendwie realisieren?
_________________ Wenn der Computer mit 0100101001010 Arbeitet ist ok,
aber wenn er mit 110 anfängt mach ich ihn kaputt!
|
|
Solid Snake
      
Beiträge: 44
Win XP Prof, Suse Linux 9 Prof
D7 Enterprise
|
Verfasst: Mo 16.05.05 19:04
Zitat: | Aber eine Frage hätte ich da noch
Kann man irgendwie die .DSX datei schützen?
Also das nur der Chat Schreib - und Leserechte hat und man die Datei solange noch einer im Chat ist nicht von Hand löschen kann!
Desweiteren sollte man die Datei auch nicht mit dem "Editor" oder sonstwas öffnen können um was zu verändern und die Datei dann wieder zu speichern!
Wenn die Datei dann noch mit dem Attribut "Versteckt" sein würde, währe es ein absoluter traum!
Kann man sowas irgendwie realisieren? |
Habe mein Problem jetzt einfach mit den beiden Datei Attributen "faReadOnly" und "faHidden" gelöst! Die noch in eigene Prozeduren gepackt (FileProtectionOn) und (FileProtectionOff) und an den benötigten stellen einfach aufgerufen!
Klappt wunderbar!
Danke für eure Hilfe
_________________ Wenn der Computer mit 0100101001010 Arbeitet ist ok,
aber wenn er mit 110 anfängt mach ich ihn kaputt!
|
|
drummer123
Hält's aus hier
Beiträge: 2
|
Verfasst: Do 11.08.05 10:32
ObscurusNox hat folgendes geschrieben: | Du sitzt an einem Netzwerk, vielleicht in einer großen Firma, und dein Kumpel sitzt in einem anderen Gebäude. Was tun ???
Ich hatte dieses Problem schon einmal und hab daher folgendes Programm geschrieben. Die meisten Firmen-Netzwerke haben allgemein zugängliche Laufwerke, auf denen sogar Guests Schreibrechte haben und ein solches Laufwerk hab ich mir zu nutzen gemacht.
Das praktische ist, dass man die in riesigen Netzwerken ja multible IP-Adresse nicht benötigt. Man muss nur ein Verzeichnis angeben, in dem die Protokoll-Datei gespeichert wird.
Außerdem hat man nicht die Probleme mit der Definition von Servern und Clients, der Chat ist für so ziemlich beliebig viele User zugänglich. Das Programm wir noch nicht perfekt sein, aber ich habe es selbst drei Wochen lange bei Bo***-Bl*******-Hildesheim während meines Praktikums getestet und soweit funktioniert's eigentlich.
(Fehler bitte melden )
DOWNLOADEN MIT "ZIEL SPEICHERN UNTER"
Programme downloaden: Pseudo-Chat.zip (279.261 Bytes)
Source downloaden: Source.zip (56.686 Bytes)
Viel Spaß damit !!!
(21.09.02 00:09 Tino) Screenshot entfernt. Datei war nicht mehr vorhanden. |
hey echt respekt ist richtig geil der Chat !!!!
|
|
150gozilla
      
Beiträge: 37
Windows XP Pro
Delphi5 Pro
|
Verfasst: Fr 26.08.05 16:49
ich habe den chat mal privat nen bissl erweitert.
Seid dem hängt sich der chat auch nicht mehr auf, wenn 2 leute gleichezeitig chatten ^^
|
|
CeeJay D-Magic
      
Beiträge: 94
Win XP Prof.
Delphi 7, Lazarus 0.9
|
Verfasst: Mi 31.08.05 10:14
Das klingt wirklich alles sehr interressant, allerding ginge doch auch folgendes:
Man nehme die TClient & TServer und baut daraus ein chat.
Wegen der IP kann man dann den Server (dessen Ip-Adresse) auf einem Netzordner in einer ".txt" (o.ä.) Speichern und ein anderes Programm (Welches nun als Client fungiert) ruft es auf um sich dann mit der IP beim Server einzuloggen, so hat man nicht das Problem, mit dem gleichzeitig schreiben und es ist auch leichter zu Programmieren.
Das war nur eine Weitere Lösung...
MFG, CeeJay D-Magic
P.S.: Mir fällt ein,
Hier kann man sich ein Beispiel Downloaden, wie das mit TCP/IP funzt:
www.delphi-forum.de/...ogramm_43227,20.html
Hoffe es hilft
|
|
150gozilla
      
Beiträge: 37
Windows XP Pro
Delphi5 Pro
|
Verfasst: Mi 31.08.05 12:37
Ja, das mit dem Dateipfad, das verstehen einige nicht
|
|
Ivo@CoMRoK
      
Beiträge: 258
Win XP
D3 Prof., D7 Pe.
|
Verfasst: Mo 06.02.06 19:27
@Andy1982:
Machs doch mal so dass du ne zweite Datei mit einbaust  da schreibst du n Boolean rein
- wenn jemand was schreibt und der(  ) Boolean ist auf false kann er in die eigentliche Datei was speichern
und der Boolean wird auf true gesetzt  wenn das Prog mit speichern fertig ist wir der Boolean wieder auf false
gesetzt
- wenn jemand was schreibt und der Boolean ist auf true  dann lass ihn ne 1/4 Sekunde warten und versuchs dann
nochmal.
Hoffe geholfen zu haben. 
_________________ Fällt der Bauer tot vom Traktor, stand am Waldrand ein Reaktor.
Ein altes indianisches Sprichwort besagt:Es kann gefährlich sein gelben Schnee zu essen.
|
|
Fighter#1
      
Beiträge: 787
Win XP, Ubuntu 8.04
Turbo Delphi 2006, Delphi 2005 Pe, Delphi 5 Pe, Netbeans 6.1, Eclipse, Microsoft VisualC#, Dev C++, PHP, HTML, CSS
|
Verfasst: Mo 06.02.06 19:34
Du musst überprüfen ob der angegebene Pfad existiert
Zu sätzlich würd ich falls der Pfad nicht existiert ne
Frage machen ob er erstellt werden soll.
Sons ganz hübsch
Wieso wird die Dsx Datei gelöscht?
Wenn sie dableibt lönnte man sie ja nachher wiederverwenden und
noch nach Tagen mit dem Selben Chat weitermachen.
_________________ Wer andere beherrscht ist stark,
wer sich selbst beherrscht ist mächtig. Lao Tse
|
|
Terra
      
Beiträge: 307
Windows 7 Ultimate
Delphi® XE3
|
Verfasst: Mi 08.02.06 15:25
Sehe diesen Topic dummerweise erst jetzt aber wollte nochmal was zu den Anfangstheard sagen.
Da stand:
Zitat: | Du sitzt an einem Netzwerk, vielleicht in einer großen Firma, und dein Kumpel sitzt in einem anderen Gebäude. Was tun ??? |
Hmm .. wie soll ich das sagen ohne mich hier unbeliebt zu machen.
Sage nur... benutzen wir doch WinChat ^^ .. Bin mir nicht sicher wegen ältere Betriebsysteme aber bei XP ist so ein Netzwerkchat standartmäßig dabei.
Zu finden unter C:\windows\system32\winchat.exe
Aber ein eigenen Netzwerkchat zu schreiben finde ich natürlich auch klasse. Schöne Arbeit.
Terra
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Do 23.02.06 21:36
ich frage mich, warum ihr nicht mit einer boolean-variable arbeitet und stattdessen den dateinamen ändert. (Das Problem ist, ich kann den Code nicht runterladen, deßhalb weiß ich nicht genau wie du arbeitest).
Ich mache demnächst vielleicht auch einen Chat, kommt darauf an ob ich morgen in der schule irgendwie eine datei im netzwerk freigeben kann. ich würde aber mit einer Datenbank arbeiten, da ich in diesem bereicht schon Erfahrung habe.
cu
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: So 26.02.06 12:12
hi
ok, dass mit der datenbank mach ich doch nicht
ich machs jetzt mit dateien, pro user eine (temporär).
sobald du eine nachricht an ihn schickst, wird die datei erzeugt.
wenn er dann den text in sein Memo-Feld lädt, löscht er die datei. somit gibts kaum probleme mit mehrfachzugriff.
bye
|
|
|