Hallo,
Ich schreibe z.Z. an einem Programm, welches 4 Units verwendet, welche alle auf zwei Dateien zugreifen.
Nun habe ich festgestellt, dass die Units die Dateien nicht ordnungsgemäß abspeichern bzw. laden.
Es werden ein Feld und ein Verbund gespeichert, jeder in einer eigenen Datei.
Unit 1 greift bei Programmstart auf beide zu und lädt die Werte um sie anzuzeigen. [Funktioniert]
Ich öffne Unit 2, verändere den Verbund und speichere und schließe den Verbund. [Funktioniert]
In Unit 1 wird die Ansicht aktualisiert, heißt die mit Unit 2 eingegebenen Werte werden angezeigt. [Funktioniert noch]
Ich öffne Unit 3, sie zeigt jedoch die alten Werte an, welche beim Programmstart aus dem Verbund geladen wurden. [Funktioniert also nicht]
Unit 3 speichert nun die alten Werte wieder in den Verbund, was das Programm unbrauchbar macht.
Liege ich richtig in der Annahme, dass die Units die Dateien aktualisieren müssten um auf sie zuzugreifen?
Ich habe versucht, die Units als einzelne Programme auszulagern, und anstatt Unit 1 P1 als Programm aufzurufen, löst das das Problem?
GIbt es, außer einer Datenbank, einen anderen Weg, das Programm ordnungsgemäß zum Laufen zu bringen?
Edit:
Ich habe die Units jetzt als externe Programme geschrieben, die mit ExecuteProcess aufgerufen werden. Dabei sollen die Dateien ebenfalls geladen werden, ich bekomme aber die Fehlermeldung "Invalid filename" und die Werte werden nicht geladen.
Ich habe versucht Daten zu laden, welche nicht zeitgleich von dem Hauptprogramm verwendet werden, aber es wurde nicht besser..
Wo liegt hier der Fehler? :/
Danke im Voraus!
MTB1Leo
Mit 4 Units auf eine Datei zugreifen - Speicherproblem
Mit 4 Units auf eine Datei zugreifen - Speicherproblem
750GB HDD CPU: i3 boost 3.6Ghz RAM: 12GB GPU: ASUS RADEON R7 270X DC II
-
- Beiträge: 340
- Registriert: Di 12. Sep 2006, 08:57
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Kontaktdaten:
Re: Mit 4 Units auf eine Datei zugreifen - Speicherproblem
1. Redest du von Dateien oder von einer Datenbank? Was für eine Datei und WIE greifst du darauf zu? Ich sehe nicht eine Zeile Programmcode und nur der dürfte interessant sein.
2. Was meinst du mit "Verbund"?
3. Poste den Quellcode, da du nicht die korrekten Fachtermini benutzt und so ohnehin niemand weiß, wovon du redest.
4. Will ich dich nicht "fertig machen"; meine Antworten sind bloß kurz und gut gemeinte Ratschläge.
2. Was meinst du mit "Verbund"?
3. Poste den Quellcode, da du nicht die korrekten Fachtermini benutzt und so ohnehin niemand weiß, wovon du redest.
4. Will ich dich nicht "fertig machen"; meine Antworten sind bloß kurz und gut gemeinte Ratschläge.
Grüße, Antrepolit
care only if your os is really burning
care only if your os is really burning
-
- Beiträge: 152
- Registriert: Mo 3. Feb 2014, 14:07
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: Mit 4 Units auf eine Datei zugreifen - Speicherproblem
Sinnvoll ist es eine Klasse zu haben die sich ausschließlich um das Halten der Daten, das Lesen und Speichern der Daten von und auf die Festplatte kümmert. Diese Klasse machst du dann projektweit gültig und sagst in den einzelnen Units nur noch sowas wie Klasse.LeseDaten und Klasse.SchreibeDaten und Klasse.Daten.Irgendwas.
.
Re: Mit 4 Units auf eine Datei zugreifen - Speicherproblem
Also ich nutze keine Datenbank, sondern folgenden Code um zu speichern:
Sind die Units integriert, ist diese Prozedur (und die entsprechende Ladeprozedur) in jeder Prozedur vorhanden.
GENRL bzw. BANK sind in den jeweiligen Units unter type deklariert.
Bei der Variante in der die Units als eigenständige Programme laufen und per aufgerufen werden, sind die Prozeduren ebenfalls vorhanden.
Hier wird jedoch beim Ausführen des Programms eine Fehlermeldung angzeigt. Monetus - Werte anpassen stellt fest "Invalid filename" und lädt GENRL bzw. BANK nicht. Die Datenbezeichnungen und der Code stimmen jedoch überein.
Code: Alles auswählen
procedure TForm1.Speichern;
var
s: file of BANK; // BANK ist ein Feld mit 12 Bereichen, welche alle aus dem Verbund(reconrd) bestehen.
E: file of GENRL; // GENRL ist ein Verbund mit verschiedenen Typen.
begin
AssignFile(s, 'src/data/BANK.bank');
Rewrite(s);
Write(s, M); // Daten schreiben
CloseFile(s);
AssignFile(E, 'src/data/GENRL.bank');
Rewrite(E);
Write(E, G); // Daten schreiben
CloseFile(E);
end;
GENRL bzw. BANK sind in den jeweiligen Units unter type deklariert.
Bei der Variante in der die Units als eigenständige Programme laufen und per
Code: Alles auswählen
ExecuteProcess('src\Monetus - Werte anpassen.exe','');
Hier wird jedoch beim Ausführen des Programms eine Fehlermeldung angzeigt. Monetus - Werte anpassen stellt fest "Invalid filename" und lädt GENRL bzw. BANK nicht. Die Datenbezeichnungen und der Code stimmen jedoch überein.
750GB HDD CPU: i3 boost 3.6Ghz RAM: 12GB GPU: ASUS RADEON R7 270X DC II
-
- Beiträge: 1102
- Registriert: Di 5. Aug 2008, 09:37
- OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
- CPU-Target: 32/64,PPC(+64), ARM
- Wohnort: Eindhoven (Niederlande)
Re: Mit 4 Units auf eine Datei zugreifen - Speicherproblem
MTB1Leo hat geschrieben: Bei der Variante in der die Units als eigenständige Programme laufen und peraufgerufen werden, sind die Prozeduren ebenfalls vorhanden.Code: Alles auswählen
ExecuteProcess('src\Monetus - Werte anpassen.exe','');
Hier wird jedoch beim Ausführen des Programms eine Fehlermeldung angzeigt. Monetus - Werte anpassen stellt fest "Invalid filename" und lädt GENRL bzw. BANK nicht. Die Datenbezeichnungen und der Code stimmen jedoch überein.
Hört sich an als ein Problem mit der Arbeits Ordner ( (?!?) Working Directory). Writeln mal [url]http://www.freepascal.org/docs-html/rtl/sysutils/getcurrentdir.htm]Getcurrentdirl[/url] in angerufene Programm (monetus - werte anpassen).
Hüte auch dafür das unter Windows File Locks ein paar Sekunden "hängen", also wenn ein Programm ein Bestand schließt kann ein anderes Programm das selben bestand nicht immer unmittelbar offenen. Es kann sich da ein paar hundert ms Verzögerung auftreten, länger wenn das System extrem tätig ist.