Autor Beitrag
slugg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Sa 26.01.08 13:21 
huhu
bin neu in delphi (1. jahr informatik leistungskurs), jetz hatten wir gestern file dran, leider ist die zeit immer nicht ausreichend um all meine fragen zu beantworten, bzw der lehrer weiß es nicht sofort ^^
folgendes problem: ich möchte so eine art messenger schreiben, einen gruppenchat.
der log bzw der speicherort soll eine datei auf einem server sein.
mein problem ist, dass die memo box, also das was man liest, was der andere schreibt (inhalt der datei) ständig aktuell sein will. wenn ich einen timer einbaue, um den text neu auszulesen, kommt es vor, dass einer die datei beschreibt während ein anderer liest. da kommt eine fehlermeldung, dass die datei gerade benutzt wird.

wie kann ich das lösen?

achja, was mir noch einfällt: wenn ich die datei lade, dann überschreibt er deren inhalt... er soll sie aber nur öffnen!
quelltext muss ich neu schreiben, da delphi mir gestern mal wieder abgeschmiert ist


mfg

edit:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button3Click(Sender: TObject);
begin
i:=edit3.text;
Memo2.Lines.LoadFromFile(i);
end;


ist i der speicherort oder der ihnalt? kam im unterricht nich so rüber

das is der quelltext zum laden der datei und ausgeben in memo 2

Moderiert von user profile iconNarses: Quote- durch Delphi-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 26.01.08 13:53 
Da i als Parameter für LoadFromFile angegeben ist, muss es der Speicherort der Datei sein. Inklusive komplettem Pfad. i sollte man aber nicht als Bezeichner für einen String nehmen, da es üblicherweise eine Schleifenvariable ist. Das ist kein guter Programmierstil, eine Variable so zu bezeichnen, dass niemand weiß was da drin ist vom Namen her (aber das kannst du ja noch nicht wissen^^).
Zudem fehlt die Variablendeklaration (var i: String; in diesem Fall).

Aber einen echten Chat wirst du auf die Weise nicht gut hinbekommen. Aber wenn euer Lehrer meint, dass ihr das so machen sollt, dann sag ich da besser nix weiter dazu^^.

user profile iconslugg hat folgendes geschrieben:
achja, was mir noch einfällt: wenn ich die datei lade, dann überschreibt er deren inhalt... er soll sie aber nur öffnen!
Das musst du dann schon so programmiert haben, wenn du die Datei nur lädst, dann wird am Inhalt auch nix geändert. Dass beim Speichern die Datei überschrieben wird, ist jedoch schon korrekt, wenn du SaveToFile benutzt. Deshalb würde ich auch lieber mit AssignFile, Rewrite / Reset / Append, etc. arbeiten.
Aber was da schief läuft kann man ohne den Quelltext ja nicht wissen.

user profile iconslugg hat folgendes geschrieben:
quelltext muss ich neu schreiben, da delphi mir gestern mal wieder abgeschmiert ist
Wie wäre es mit zwischendurch abspeichern bzw. automatisch speichern beim Ausführen in den Optionen einstellen? ^^
slugg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Sa 26.01.08 14:02 
ja, ich hab immer 0 plan wie ich die variablen nennen soll, deshalb mach ich meist commentar dahinter oder schreib mir auf wie ich die bezeichnet hab ^^
die variabdeklaration is drüber, hab ich vergessen mit zu kopieren ^^
ne die lehrer haben da nichts gesagt, das war ne idee von mir ^^
will halt an dem "projekt" bissl lernen, da die lehrer das alles nich so rüberbringen wies sein sollte...

wo kann ich das automatische speichern einstellen?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 26.01.08 14:16 
Es gibt da Probleme, die du ja auch schon teilweise selbst bemerkt hast.
1. Die Datei wird mit der Zeit ja immer größer. Man müsste also theoretisch auch wieder Daten löschen. Dann müsste man aber nicht mehr nur einfach die Datei laden sondern auch dafür sorgen, dass die aus der Datei gelöschten Daten trotzdem angezeigt bleiben.
Das geht zwar ist aber etwas umständlich.
Du kannst das natürlich auch ignorieren. Funktionieren tuts ja, nur bei sehr vielen Chateinträgen dauerts halt immer länger.
2. Wie du bereits bemerkt hast: Wenn mehrere gleichzeitig auf die Datei zugreifen, gibts Probleme. Wenn man allerdings jeweils die Datei exklusiv öffnet und du Zugriffe so lange versuchst, bis die Datei jeweils nicht mehr gesperrt ist, dann sollte das gehen.

Mir fiele da schon noch mehr ein, aber das sind die wichtigsten Problempunkte glaube ich. Mir ist aber auch klar, dass ein echter Chat (via direkter Verbindung zwischen den Programmen auf den Rechnern) sicher nichts ist, was sich für deinen Kenntnisstand eignet. Wenn du also einen Chat als Projekt machen willst, dann musst du es wohl so machen ;-).

user profile iconslugg hat folgendes geschrieben:
ja, ich hab immer 0 plan wie ich die variablen nennen soll, deshalb mach ich meist commentar dahinter oder schreib mir auf wie ich die bezeichnet hab ^^
Nun ja, in diesem Fall z.B. DateFilePath, es sollten eben Begriffe sein, so man dann auch dran sehen kann, was dahinter steckt.

user profile iconslugg hat folgendes geschrieben:
wo kann ich das automatische speichern einstellen?
www.delphi-forum.de/viewtopic.php?t=79618
slugg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Sa 26.01.08 14:38 
danke

naja das soll ja kein chat sein der für 2 leute is ^^
soll schon über datei gehen, weil wir das halt grad dran haben udn ich damit lernen will, sozusagen
ich lern immer leichter wenn ich was wiederhole...

wie mach ich ne memo box leer?
bei nem edit: edit1.text:='';
wie is das bei memo?

gefunden: memo1.clear; x_D

mein text bisher, geht aber leider nich wie ichs will

ausblenden volle Höhe 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:
43:
44:
45:
46:
47:
48:
implementation

{$R *.dfm}
var i:textFile;
d:string;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  d:=edit3.text;
  Memo2.Lines.LoadFromFile(d);
end;

procedure TForm1.Button2Click(Sender: TObject);
var a, e:integer;
begin
  d:=edit2.Text;
  AssignFile(i,d);
  rewrite (i);
  e:=Memo1.Lines.Count;
  for a:=0 to e do
    writeln (i, memo1.Lines.Strings[a]);
  CloseFile(i);
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var e,a:integer;
begin
  d:=edit2.Text;
  AssignFile(i,d);
  append (i);
  e:=Memo1.Lines.Count;
  for a:=0 to e do
    writeln (i, memo1.Lines.Strings[a]);
  CloseFile(i);
  memo1.clear;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  d:=edit3.text;
  Memo2.Lines.LoadFromFile(d);
end;

end.


begin
d:=edit2.Text;
AssignFile(i,d);
rewrite (i);
e:=Memo1.Lines.Count;
for a:=0 to e do
writeln (i, memo1.Lines.Strings[a]);
CloseFile(i);
end;
hier mag er mich nich so ganz, wegen dem rewrite? <<<< edit: hat sich erledit!
rest bleibt ^^


wo ist hier

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
begin
  AssignFile(i,d);
  append (i);
  e:=Memo1.Lines.Count;
  for a:=0 to e do
    writeln (i, user + ' sagt: ' + memo1.Lines.Strings[a]);
  CloseFile(i);

  memo1.clear;

  Memo2.Lines.LoadFromFile(d);

  Memo2.Perform(WM_VSCROLL, SB_BOTTOM, 0);
end;


der fehler, dass er ausgibt user + ' sagt: ' + memo1.Lines.Strings[a] (also der username+sagt: + das was der schreibt) und in der nächsten zeile nur "user sagt:"

also sozusagen 2 nachrichten mit einem klick? die 2. is dabei leer
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 26.01.08 16:06 
user profile iconslugg hat folgendes geschrieben:
wo ist hier

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
begin
  AssignFile(i,d);
  append (i);
  e:=Memo1.Lines.Count;
  for a:=0 to e - 1 do
    writeln (i, user + ' sagt: ' + memo1.Lines.Strings[a]);
  CloseFile(i);

  memo1.clear;

  Memo2.Lines.LoadFromFile(d);

  Memo2.Perform(WM_VSCROLL, SB_BOTTOM, 0);
end;


der fehler, dass er ausgibt user + ' sagt: ' + memo1.Lines.Strings[a] (also der username+sagt: + das was der schreibt) und in der nächsten zeile nur "user sagt:"
Memo1.Lines.Count ist ja z.B. 1, also eine Zeile. Jetzt gehst du die Schleife durch, zuerst mit a = 0, dann mit a = 1. Die Schleife darf nur einmal durchlaufen werden. Nämlich mit dem Index 0, weil dies die erste Zeile ist.
Deshalb die -1, die Schleife läuft dann z.B. von 0 bis 1 - 1 = 0, also einmal mit dem Index 0.
slugg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Sa 26.01.08 16:58 
wow danke ^^ geht :)
supi :P

joa wie kann ich die farbe in einer memo ändern? also schriftfarbe?
wollt das per radiobox wählen lassen, dass jeder ne andere farbe nehmen kann, sozusagen!

und mit der automatischen aktualisierung der anzeige, is das sehrs chwer? x_X
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 26.01.08 17:07 
Zur automatischen Aktualisierung kann man, wenn die Datei lokal auf dem selben Rechner liegt sich benachrichtigen lassen, wenn die verändert wird. Das geht aber nicht, wenn die woanders liegt. Da das zudem noch relativ kompliziert ist, ist ein Timer wohl am sinnvollsten.
Am besten vergleichst du einfach die Dateigröße mit der beim letzten Auslesen (die du dir natürlich in einer Variablen merken musst zu dem Zweck).

Zur Frage mit der Farbe: Das hat nix mehr mit dem Dateizugriff zu tun ;-). Neue Frage --> Neuer Thread bitte.
slugg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Sa 26.01.08 17:24 
ja dacht das kann ich hier gleich mit abhandeln ^^
in anderen foren wird da gemeckert, wenn man wegen jeder kleinen frage was neues aufmacht xD

ja das mit dem timer und der datengröße... kp ^^
soweit sind wir nicht... wird noch ewig dauern!

habs halt immo so gemacht, dass ein timer die datei neu einließt. problem ist, dass es sein kann, dass die bereits verwendet wird... ne andere idee hab ich als noob nich ^^
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 26.01.08 17:31 
user profile iconslugg hat folgendes geschrieben:
problem ist, dass es sein kann, dass die bereits verwendet wird...
Damit musst du natürlich rechnen. Aber da du ja weißt, dass das passieren kann, kannst du das ja einplanen und ggf. auftretende Fehler entsprechend behandeln.
slugg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Sa 26.01.08 17:57 
wie kann ich per delphi einen programmabsturz bzw ne fehlermeldung ignorieren? so das der user nichts mitbekommt? dann wäre das okay, da kann er halt nur alle 2 sec oder so zugrefeifen!
also fehlermeldung deaktivieren und einfach nochma versuchen...