![]() |
Datei von Programmversion abhängig machen
Ich habe eine Dat-Datei welche ich von der Versionsnummer meines Programmes abhängig machen möchte.
Also wenn ich mein Programm starte und auf die Dat-Datei zugreife, soll das Programm prüfen, ob die Dat-Datei mit dieser Programmversion auch erstellt wurde. So die Idee :-) Ihr Habt mir hier im Forum schon mal mit der Versionsauslesung geholfen dazu habe ich in meinem Programm den Code eingearbeitet der auch klasse ist.
Delphi-Quellcode:
Jetzt suche ich den Zündigen Gedanken zu meiner Idee, könnt Ihr mir da helfen? :zwinker:
procedure TAboutBox.GetVersionInfo(const AFilename:String);
const cCaptions : array[0..5] of String = ('Firmenname','Interner Name','Original-Dateiname','Produktname', 'Produktversion','Sprache'); cIdents : array[0..4] of String = ('CompanyName','InternalName','OriginalFilename','ProductName','ProductVersion'); type PLanguageCharSet = ^TLanguageCharSet; TLanguageCharSet = packed record L,C : Word end; var V1, V2, V3, V4 : Word; VerInfoSize : Integer; VerValueSize : DWord; VerInfo : Pointer; VerValue : PVSFixedFileInfo; BufLen : DWord; LanguageCharSet : PLanguageCharSet; s : String; i : Integer; function GetStringValue(const AIdent:String):String; var BufLen : DWord; p : Pointer; begin if VerQueryValue(VerInfo, PChar(Format('\StringFileInfo\%.4x%.4x\%s', [LanguageCharSet^.L,LanguageCharSet^.C,AIdent])), p,BufLen) and (BufLen>0) then begin SetString(Result,PChar(p),BufLen-1); end else begin Result:=''; end; end; begin VerInfoSize:=GetFileVersionInfoSize(PChar(AFilename),BufLen); if VerInfoSize>0 then begin GetMem(VerInfo,VerInfoSize); try if GetFileVersionInfo(PChar(AFilename),0,VerInfoSize,VerInfo) then begin if VerQueryValue(VerInfo,'\',Pointer(VerValue),VerValueSize) then with VerValue^ do begin V1:=dwFileVersionMS shr 16; V2:=dwFileVersionMS and $FFFF; V3:=dwFileVersionLS shr 16; V4:=dwFileVersionLS and $FFFF; LblDateiVersionN.Caption:=Format('%d.%d.%d.%d',[V1,V2,V3,V4]); end; if VerQueryValue(VerInfo, '\VarFileInfo\Translation', Pointer(LanguageCharSet),BufLen) then begin LblDateiVersion.Caption:=GetStringValue('FileVersion'); LblBeschreibung.Caption:=GetStringValue('FileDescription'); LblCopyright.Caption:=GetStringValue('LegalCopyright'); with StringGrid1 do begin ColWidths[0]:=100; ColWidths[1]:=300; for i:=0 to 4 do begin Cells[0,i]:=cCaptions[i]; Cells[1,i]:=GetStringValue(cIdents[i]); end; SetLength(s,100); BufLen:=VerLanguageName(LanguageCharSet.L,PChar(s),100); if BufLen>0 then begin SetLength(s,StrLen(PChar(s))); Cells[0,5]:=cCaptions[5]; Cells[1,5]:=s; end; end; end; end; finally FreeMem(VerInfo,VerInfoSize); end; end; end; procedure TAboutBox.FormCreate(Sender: TObject); begin GetVersionInfo(Application.Exename); end; |
Re: Datei von Programmversion abhängig machen
Mal so ganz grob überlegt:
die Datei soll von der Programmversion abhängig sein ... also muß man wohl die Version beim Speichern mit in die Datei einbauen und beim Auslesen der Datei mit der aktuellen Programmversion vergleichen. :angel2: |
Re: Datei von Programmversion abhängig machen
jups so in der Art.
deshalb wäre die Frage wie ich das Anfange. mein Recorder zur Dat-Datei hatte ich so aufgebaut
Delphi-Quellcode:
so wie binde ich jetzt die Versionsangaben hier ein?
type TArtikelerfassungRec = packed record
Datensatz:ShortString; AbteilungName:ShortString; AbteilungNr:string[5]; Artikel:ShortString; ArtikelAnzahl:longint; ArtikelWert:double; ArtikelGesamtpreis:double; ListeGesamt:double; Fremdobjekt:ShortString; ... und das ganze lasse ich dann Anzeigen procedure CArtikelerfassung.Show(ArtikelGrid:TStringGrid); var i:integer; pRec:pArtikelerfassungRec; begin // Initialisierung SummeGesamtwert := 0; // Verarbeitung und Ausgabe if Artikel.Count = 0 then begin ArtikelGrid.RowCount := 2; ArtikelGrid.cells[0,1] := '-'; ArtikelGrid.cells[1,1] := '-'; ArtikelGrid.cells[2,1] := '-'; ArtikelGrid.cells[3,1] := '-'; ArtikelGrid.cells[4,1] := '-'; ArtikelGrid.cells[5,1] := '-'; ArtikelGrid.cells[6,1] := '-'; ArtikelGrid.cells[7,1] := '-'; ArtikelGrid.cells[8,1] := '-'; end else begin ArtikelGrid.RowCount := Artikel.Count+1; for i:=0 to Artikel.Count-1 do begin pRec := Artikel.Items[i]; ArtikelGrid.cells[0,i+1] := IntToStr(i+1); ArtikelGrid.cells[1,i+1] := pRec^.AbteilungName; ArtikelGrid.cells[2,i+1] := pRec^.AbteilungNr; ArtikelGrid.cells[3,i+1] := pRec^.Artikel; ArtikelGrid.cells[4,i+1] := FormatFloat('#,##0.00 €', pRec^.ArtikelWert); ArtikelGrid.cells[5,i+1] := IntToStr(pRec^.ArtikelAnzahl); GesamtPreis:= pRec^.ArtikelAnzahl * pRec^.ArtikelWert; ArtikelGrid.cells[6,i+1] := FormatFloat('#,##0.00 €', pRec^.ArtikelGesamtpreis); ArtikelGrid.cells[7,i+1] := pRec^.ArtikelVerbleib; ArtikelGrid.cells[8,i+1] := pRec^.Fremdobjekt; SummeGesamtwert:= SummeGesamtwert + GesamtPreis; end; end; end; |
Re: Datei von Programmversion abhängig machen
Es kommt darauf an, wie du das ganze nun speicherst/ließt.
Im Gunde verpaßt man in soeinem Fall seiner Datei einen Header, also einem "speziellen" Datensatz zu Begin der Datei, wo solche Informationen dann drinnen stehn. |
Re: Datei von Programmversion abhängig machen
wie Erstelle ich so etwas???
|
Re: Datei von Programmversion abhängig machen
Mach einen zweiten Record mit den Versionsinformationen und schreib diesen immer als erstes einmal in die Datei.
|
Re: Datei von Programmversion abhängig machen
Zitat:
Die Datei sollte unabhängig von deiner Programmversion sein. Wenn die Daten z.B. als XML gespeichert werden, dann können jederzeit zusätzliche Elemente gespeichert werden. Eine ältere Programmversion kennt die neuen Datenelemente nicht und ignoriert sie einfach. Trotzdem kann auch ein altes Programm mit einer neueren Datenstruktur arbeiten. Auch umgegekehrt gilt: eine neuere Programmversion kann auch eine alte Datenstruktur laden. Beim Speichern werden dann die neuen Datenelemente rausgeschrieben. Es gibt neben XML auch noch andere Datenformate mit denen man eine ähnliche Flexibilität erreicht. (z.B. ![]() ![]() Oder nimm das PNG oder TIFF-Dateiformat als Vorbild. In diesen Dateien steckt häufig mehr Information, als die meisten Programme anzeigen; dennoch gibt es keine Probleme weil die Daten in sog. "Chunks" verpackt sind. |
Re: Datei von Programmversion abhängig machen
Ich glaube ich werde das mal mit dem zweiten Datenrecorder versuchen.
Da habe ich mich ja schon reingelesen. Das mit dem XML und so wird bestimmt eine Nummer zu hoch für mich. |
Re: Datei von Programmversion abhängig machen
XML ist in seinen Grundzügen garnicht so schwer, wie es vielleicht aussehn mag.
Gibt auch massenhaft Beispiele im Forum. PS: als ich das letzte Mal mit Binärdateien gearbeitet hatte, da hab ich das Programm von der Dateiversion abhängig gemacht. (da sich ja meist das Programm schneller entwickelt/verändert, als dessen Speicherformat) So kann man das Programm weiterentwickeln und solange sich nichts am Dateiformat ändert, gibt es keine Probleme. Ansonsten kann man sogar Dateiformats-abhängig mehrere Lade-Prozeduren integrieren und so auch ältere Formate noch unterstüzen. |
Re: Datei von Programmversion abhängig machen
Hallo
Grundsätzlich schliesse ich mich der Meinung an, daß die Daten versionsunabhäng sein sollten. Trotzdem zu deiner Frage: 1.) Wie wäre es, wenn du die Versionsnummer in den dateiname übernimmst ? 2.) Verwende doch eine CSV-Datei (-> TCSVReader) und mache in deine Daten ein Spalte mit der Versionsnummer ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz