AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Versionsinfo automatisch ins Programm übernehmen
Thema durchsuchen
Ansicht
Themen-Optionen

Versionsinfo automatisch ins Programm übernehmen

Ein Thema von m-werk · begonnen am 2. Aug 2002 · letzter Beitrag vom 6. Aug 2002
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#11
  Alt 5. Aug 2002, 21:43
Zitat von MathiasSimmack:
@Chris: nicht traurig sein. Ich wurde letztens als "Herr der großen Worte" bezeichnet.
War nicht böse gemeint . Der Indianername von Mathias ist ja übrigens "Flinkerfüller".
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
m-werk

Registriert seit: 14. Jun 2002
215 Beiträge
 
Delphi 2009 Architect
 
#12
  Alt 6. Aug 2002, 04:13
Hi, leider hat mir der Beitrag nicht weitergeholfen. Ich möchte das ganz einfach gestallten.

Ich habe ein Label wo die Version drinn steht. Dieses Label möchte ich immer aktalisiert haben, wenn ich es im Programm erhöhe! Geht das auch einfach mit einem kleinen Code?
Grüße, m-werk
  Mit Zitat antworten Zitat
m-werk

Registriert seit: 14. Jun 2002
215 Beiträge
 
Delphi 2009 Architect
 
#13
  Alt 6. Aug 2002, 08:13
Hi, find ich ganz witzig, wenn so beiträge früher oder später erscheinen. Aber das funktioniert jetzt glaub ich eh schon.

Die funktion: function GetFileVersionsString(const p_sFilepath : string) : string;

Wo setzte ich diese hin? Ich habe 2 Formulare wo die Informationen drinn stehen müssen.

Meiner meinung nach muß ich diese unter 'puplik' setzen.
IST DAS RICHTIG?
Grüße, m-werk
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#14
  Alt 6. Aug 2002, 08:36
Ja, ähm kommt jetzt drauf an. Also wenn du es in zwei Formularen brauchst, der Code also in zwei Units steht, dann würde ich die Funktion in eine dritte auslagern und diese bei Uses in den anderen beiden Units (den Formular-Units) einbinden.

Wenn du dir von Delphi automatisch eine neue Unit generieren läßt, also auf neu-->Unit klickst, dann schmeiß aber bitte alle überflüssigen Units raus. Ich weiß jetzt nicht genau, was nicht gebraucht wird, aber die Unit Forms brauchst du auf keinen Fall in der dritten Unit für die ausgelagerte Funktion. Windows, SysUtils, Classes sollte reichen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#15
  Alt 6. Aug 2002, 10:17
Moin Luckie,

bei Neu/Unit wird doch gar keine Uses Eintragung in der neuen Unit gemacht
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#16
  Alt 6. Aug 2002, 10:27
Na ja, es reicht die Unit "Windows.pas":
Code:
[b]unit[/b] FileVer;

[b]interface[/b]

[b]function[/b] GetFileVersionsString([b]const[/b] p_sFilepath : [b]string[/b]) : [b]string[/b];


[b]implementation[/b]

[b]uses[/b]
  Windows;

[color=#000080][i]//
// "frmt" (Copyright, Assarbad)
//[/i][/color]
[b]function[/b] frmt(mformat: [b]string[/b]; args: [b]array[/b] [b]of[/b] POINTER): [b]string[/b];
[b]var[/b]
  buf: [b]array[/b][0..$3ff][b]of[/b] char;
[b]begin[/b]
  ZeroMemory(@buf[0], sizeof(buf));
  wvsprintf(@buf[0], @mformat[1], pchar(@args));
  SetString(result, pchar(@buf[0]), lstrlen(@buf[0]));
[b]end[/b];


[b]const[/b] [color=#000080][i]// Das Ergebnis soll ja nett formatiert sein :)[/i][/color]
  sFixVerFormat = 'Fileversion: %d.%d.%d.%d / Productversion: %d.%d.%d.%d';

[b]function[/b] GetFileVersionsString([b]const[/b] p_sFilepath : [b]string[/b]) : [b]string[/b];
[b]var[/b]
  dwVersionSize  : DWord;           [color=#000080][i]// Buffer für die Grösse der Versionsinfo der abgefragten Datei[/i][/color]
  dwDummy        : DWord;           [color=#000080][i]// Dummy, Wert wird nicht benötigt[/i][/color]
  pVerBuf        : Pointer;         [color=#000080][i]// Buffer für die Versionsdaten[/i][/color]
  pFixBuf        : PVSFixedFileInfo; [color=#000080][i]// Buffer für die Versionsinfo fester Länge[/i][/color]
  sReqdInfo      : [b]string[/b];          [color=#000080][i]// Hier kommt rein, welcher Teil der Versionsinfo abgefragt werden soll[/i][/color]
[b]begin[/b]
  [color=#000080][i]// Annahme: Die Datei hat keine Versionsinfo[/i][/color]
  Result       := frmt(sFixVerFormat,
    [POINTER(0),POINTER(0),POINTER(0),POINTER(0),
     POINTER(0),POINTER(0),POINTER(0),POINTER(0)]);

  dwDummy      := 0;  [color=#000080][i]// Dummy initialisieren[/i][/color]
  sReqdInfo    := '\'; [color=#000080][i]// Es soll die Versionsinfo fester Länge abgefragt werden

  // Mal sehen, wieviel Platz die Versionsinfo der Datei braucht[/i][/color]
  dwVersionSize := GetFileVersionInfoSize(PChar(p_sFilepath),dwDummy);
  [b]if[/b] dwVersionSize > 0 [b]then[/b] [color=#000080][i]// Wenn > 0, dann Versionsinfo vorhanden[/i][/color]
    [b]try[/b]
      GetMem(pVerBuf,dwVersionSize); fillchar(pVerBuf^,dwVersionSize,0);

      [color=#000080][i]// Gesamte Versionsinformationen auslesen[/i][/color]
      [b]if[/b] GetFileVersionInfo(PChar(p_sFilepath),0,dwVersionSize,pVerBuf) [b]then[/b]
        [b]begin[/b] [color=#000080][i]// Werte für Versionsinfo fester Länge extrahieren[/i][/color]
          [b]if[/b] VerQueryValue(pVerBuf,PChar(sReqdInfo),Pointer(pFixBuf),dwDummy) [b]then[/b]
            [b]begin[/b]
              [color=#000080][i]// und als Ergebnis ausgeben[/i][/color]
              Result := frmt(sFixVerFormat,
                [POINTER((pFixBuf^.dwFileVersionMS [b]and[/b] $FFFF0000) [b]shr[/b] 16),
                 POINTER(pFixBuf^.dwFileVersionMS [b]and[/b] $0000FFFF),
                 POINTER((pFixBuf^.dwFileVersionLS [b]and[/b] $FFFF0000) [b]shr[/b] 16),
                 POINTER(pFixBuf^.dwFileVersionLS [b]and[/b] $0000FFFF),
                 POINTER((pFixBuf^.dwProductVersionMS [b]and[/b] $FFFF0000) [b]shr[/b] 16),
                 POINTER(pFixBuf^.dwProductVersionMS [b]and[/b] $0000FFFF),
                 POINTER((pFixBuf^.dwProductVersionLS [b]and[/b] $FFFF0000) [b]shr[/b] 16),
                 POINTER(pFixBuf^.dwProductVersionLS [b]and[/b] $0000FFFF)]);
        [b]end[/b];
      [b]end[/b];
    [b]finally[/b] [color=#000080][i]// Resourcen wieder freigeben[/i][/color]
      FreeMem(pVerBuf,dwVersionSize);
    [b]end[/b];
[b]end[/b];

[b]end[/b].
Das Einbinden der Unit und Benutzen der Funktion sollte wohl keine größeren Probleme machen, m-werk. Ich würde generell diesen Weg über eine extra Unit vorziehen, denn wenn du die Funktion vielleicht auch in einem anderen Programm verwenden willst, dann fängst du an, erst mal alles aus dem Quellcode herauszukopieren. So nimmst du einfach nur die Unit, und fertig.

Interessanter Nebeneffekt: benutzt man die Einstellungen von Delphi bezüglich Datei- und Produktversion, ist der Wert in beiden Fällen identisch. In meinen Projektoptionen steht z.B. als Dateiversion 1.2.7.548 und als Produktversion 1.2.7.0. Es wird aber beide Male die Dateiversion angezeigt.
Benutze ich aber eine Ressourcendatei mit Versionsangaben, wird sowohl die Dateiversion als auch die (diesmal richtige) Produktversion dargestellt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#17
  Alt 6. Aug 2002, 11:17
Zitat von Christian Seehase:
Moin Luckie,

bei Neu/Unit wird doch gar keine Uses Eintragung in der neuen Unit gemacht
Tatsächlich.

@Mathias:
Assarbad hat wohl damit:
Code:
// 
// "frmt" (Copyright, Assarbad)
// 
function frmt(mformat: string; args: array of POINTER): string;
var
  buf: array[0..$3ff]of char;
begin
  ZeroMemory(@buf[0], sizeof(buf));
  wvsprintf(@buf[0], @mformat[1], pchar(@args));
  SetString(result, pchar(@buf[0]), lstrlen(@buf[0]));
end;
einen Evergreen geschrieben. Zumindest verfolgt mich das Ding in letzter Zeit ständig.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#18
  Alt 6. Aug 2002, 13:38
Wie: "ständig"?
Ich hab´s bisher nur einmal im IP-Demo benutzt, um die IP-Adresse schön formatiert an das Label weiterzureichen. Das ist doch nicht ständig.

Hey, Moment - da hat doch mal jemand, den wir hier nicht näher nennen wollen, vergessen, die "SysUtils.pas" aus seiner NT-Dienst-Erweiterung herauszunehmen ...

Also, ich denke nur an die Hord... äh, Scharen von NonVCL-Entwicklern, die nach dem Studium unserer -Achtung, Schleichwerbung!- "Delphi-Tutorials" vielleicht auch die Versionsinfos anzeigen lassen wollen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#19
  Alt 6. Aug 2002, 19:41
Diese Vorkommnisse meinte ich. Da kommt mir aber schon wieder eine Idee. Näheres mal in einer Mail an dich.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
m-werk

Registriert seit: 14. Jun 2002
215 Beiträge
 
Delphi 2009 Architect
 
#20
  Alt 6. Aug 2002, 19:52
Hi Leute, ich danke euch. Es hat alles prima funktioniert. Ich habe mich an eure Anweisungen gehalten. Genauso wollte ich es haben. DANKE nochmals.
Grüße, m-werk
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz