Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   [Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennung (https://www.delphipraxis.net/97999-%5Bkompo%5D-twindowsversionsinfo-kompo-zur-windowserkennung.html)

DeddyH 4. Jan 2009 16:10

Re: [Kompo] TWIndowsVersionsInfo - Kompo zur Windowserkennun
 
Das sieht man doch bereits am Aufruf des Constructors.
Delphi-Quellcode:
var wvi: TWindowsVersionInfo;
begin
  wvi := TWindowsVersionInfo.Create(self);
  try
    Edit_ComplString.Text := wvi.WindowsVersionsString;
    Edit1.Text := wvi.ServicePack;
    Edit2.Text := IntToStr( wvi.MajorVersion );
    Edit3.Text := IntToStr( wvi.MinorVersion );
    Edit4.Text := IntToStr( wvi.BuildNumber );
  finally
    wvi.Free;
  end;
end;
Aus dem Kopf getippt, müsste aber stimmen.

emsländer 4. Jan 2009 16:12

Re: [Kompo] TWIndowsVersionsInfo - Kompo zur Windowserkennun
 
Zitat:

Zitat von DeddyH
Das sieht man doch bereits am Aufruf des Constructors.
Delphi-Quellcode:
var wvi: TWindowsVersionInfo;
begin
  wvi := TWindowsVersionInfo.Create(self);
  try
    Edit_ComplString.Text := wvi.WindowsVersionsString;
    Edit1.Text := wvi.ServicePack;
    Edit2.Text := IntToStr( wvi.MajorVersion );
    Edit3.Text := IntToStr( wvi.MinorVersion );
    Edit4.Text := IntToStr( wvi.BuildNumber );
  finally
    wvi.Free;
  end;
end;
Aus dem Kopf getippt, müsste aber stimmen.

das hilft aber nicht gegen das "Char-Problem":

Delphi-Quellcode:
if (lstrcmpi(osvi.szCSDVersion,'Service Pack 2') = 0) then
(lstrcmpi(osvi.szCSDVersion,'Service Pack 6') = 0) then

Inkompatible Typen: Array und PWideChar.
Gruss

EL

DeddyH 4. Jan 2009 16:15

Re: [Kompo] TWIndowsVersionsInfo - Kompo zur Windowserkennun
 
Richtig, aber das ist auch nicht die Frage gewesen, auf die ich geantwortet habe. Das "Char"-Problem bezieht sich wieder einmal auf ANSI <--> Unicode.

juergen 4. Jan 2009 16:19

Re: [Kompo] TWIndowsVersionsInfo - Kompo zur Windowserkennun
 
@DeddyH,
vielen Dank, genau das habe ich gesucht.
Zitat:

Zitat von DeddyH
Das sieht man doch bereits am Aufruf des Constructors.

Ich wüßte leider nicht wo man da nachschauen muss um das zu erkennen.:oops:

DeddyH 4. Jan 2009 16:26

Re: [Kompo] TWIndowsVersionsInfo - Kompo zur Windowserkennun
 
Zitat:

Delphi-Quellcode:
wvi := TWindowsVersionInfo.Create(self);

Das bedeutet ja, dass wvi vom Typ TWindowsVersionInfo (oder zumindest eines Vorfahren davon) sein muss, sonst würde der Compiler das gar nicht zulassen ;)

MagicAndre1981 4. Jan 2009 22:40

Re: [Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennun
 
Update auf Version 1.5

Den Download gibt es im ersten Beitrag:
http://www.delphipraxis.net/internal...=765213#765213

Die Komponente lässt sich nun unter Delphi 2009 kompilieren, zudem sind 2 neue Properties hinzugekommen (Codename und IsBeta (ist nützlich wenn man nicht weiß ob die Version des Vista Sp2 noch ne Beta ist oder nicht, denn wenn die SP Beta abläuft bekommt man nach 2 Stunden Nutzung einen BSOD)) und die Komponente erkennt Windows 7.

Viel Spaß, ich hätte nicht gedacht dass die so viele Leute nutzen und ne Delphi 2009 Version wollen :thumb:

ringli 14. Jan 2009 05:51

Re: [Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennun
 
Ich hoffe ich zweckentfremde den Thread nicht, aber ich habe mir die Komponente um eine Funktion erweitert damit ich für eine einfache Abfrage der Betriebssystemversion in meinen Programmen nicht extra eine Klasse erzeugen bzw. wieder freigeben muss. Vielleicht kann es ja noch jemand gebrauchen.

Hier die entsprechenden Erweiterungen in der WindowsVersionInfo.pas:
Delphi-Quellcode:
interface

.
.
.

type
  // Vergleichsmodus auswählen
  // Wird nur für die Funktion "CheckWinVer" benötigt
  TCompareMode = (
    Like,         // gleich
    GreaterThan,  // größer als
    GreaterLike,  // größer gleich
    LessThan,     // kleiner
    LessLike,     // kleiner gleich
    OutSide       // außerhalb
  );

.
.
.

// Einfache Abfrage der Windowsversion ohne extern die Klasse verwenden zu müssen
function CheckWinVer(CompareMode : TCompareMode; CompareWinVer : TWindowsVersions) : Boolean;

implementation

.
.
.

// Einfache Abfrage der Windowsversion ohne extern die Klasse verwenden zu müssen
function CheckWinVer(CompareMode : TCompareMode; CompareWinVer : TWindowsVersions) : Boolean;
var
  wvi : TWindowsVersionInfo;
begin
  Result := False;
  {$IFDEF USE_VCL}
    wvi := TWindowsVersionInfo.Create(nil);
  {$ELSE}
    wvi := TWindowsVersionInfo.Create;
  {$ENDIF}
  case CompareMode of
    Like       : if wvi.WindowsVersion = CompareWinVer then Result := True;
    GreaterThan : if wvi.WindowsVersion > CompareWinVer then Result := True;
    GreaterLike : if wvi.WindowsVersion >= CompareWinVer then Result := True;
    LessThan   : if wvi.WindowsVersion < CompareWinVer then Result := True;
    LessLike   : if wvi.WindowsVersion <= CompareWinVer then Result := True;
    OutSide    : if wvi.WindowsVersion <> CompareWinVer then Result := True;
  end;
  FreeAndNil(wvi);
end;
Beispielaufruf:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if CheckWinVer(Like, wvWinXP) then
    ShowMessage('WinXP')
  else
    ShowMessage('Kein WinXP');
end;

DeddyH 14. Jan 2009 10:59

Re: [Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennun
 
Kleiner Verbesserungsvorschlag:
Delphi-Quellcode:
function CheckWinVer(CompareMode : TCompareMode; CompareWinVer : TWindowsVersions) : Boolean;
var
  wvi : TWindowsVersionInfo;
begin
  {$IFDEF USE_VCL}
    wvi := TWindowsVersionInfo.Create(nil);
  {$ELSE}
    wvi := TWindowsVersionInfo.Create;
  {$ENDIF}
  try
    case CompareMode of
      Like       : Result := wvi.WindowsVersion = CompareWinVer;
      GreaterThan : Result := wvi.WindowsVersion > CompareWinVer;
      GreaterLike : Result := wvi.WindowsVersion >= CompareWinVer;
      LessThan   : Result := wvi.WindowsVersion < CompareWinVer;
      LessLike   : Result := wvi.WindowsVersion <= CompareWinVer;
      OutSide    : Result := wvi.WindowsVersion <> CompareWinVer;
      else
        Result := False;
    end;
  finally
    FreeAndNil(wvi);
  end;
end;

pertzschc 25. Feb 2009 18:07

Re: [Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennun
 
Zitat:

Zitat von MagicAndre1981
Update auf Version 1.5

Hallo Andre,

danke für das Update auf Version 1.5. Leider wirft diese Version bei der Ausführung in der IDE immer eine Exception, da bei meinem Windows (XP SP3) weder der Regeintrag "CSDBuildNumber" existiert noch die Property "BuildLabEx" gefüllt ist. Damit hält die IDE beim Start meines Programmes immer an der Exceptionstelle an, was lästig ist. Wird dieses ganze BuildLabEx oder CSDBuild so dringend benötigt?

Delphi-Quellcode:
    function GetRevisionFromBuildLabEx(): DWORD;
    var
      sp : TStrSplitter;
    begin
      sp := TStrSplitter.Create;
      try
        try
          sp.Execute(BuildLabEx,'.');                 // hier ist BuildLabEx = '' bei mir
          Result := StrToInt( sp[1] );
        except on E: EConvertError do
          Result := MAXDWORD;
        end;
      finally
        FreeAndNil(sp);
      end;
    end;

Begin
  Result := MAXDWORD;
  bRevFromBuildLabEx := false;
  sCSDBuildnumber := '0';
  iCSDBuildnumber := 0;
  try
    sCSDBuildnumber := RegReadString (HKEY_LOCAL_MACHINE,'SOFTWARE\Microsoft\Windows NT\CurrentVersion\',
    'CSDBuildNumber');
    if sCSDBuildnumber <> '' then                        // hier ist sCSDBuildnumber = '' bei mir
      iCSDBuildnumber := StrToInt( sCSDBuildnumber )
    else
    Begin
[b]     iCSDBuildnumber := GetRevisionFromBuildLabEx;[/b]
      bRevFromBuildLabEx := true;
    end
  except on E: EConvertError do
  end;
Danke und Gruß,
Christoph

MagicAndre1981 25. Feb 2009 22:30

Re: [Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennun
 
schalte in der IDE die Option "Bei Delphi Exceptions stoppen" ab. Ja die Funktion brauche ich sonst kann man nicht zwischen den SP Versionen bei Vista unterscheiden. Den Eintrag gibts bei XP nur bei Betas, frag mich nicht warum die MS mal einbaut und mal nicht.

pertzschc 26. Feb 2009 11:05

Re: [Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennun
 
Zitat:

Zitat von MagicAndre1981
schalte in der IDE die Option "Bei Delphi Exceptions stoppen" ab.

Das würde ich gerne vermeiden.

Hier ein Vorschlag, wenn es keinerlei Betaversionen/Builds auf dem Rechner ist:

Delphi-Quellcode:
    function GetRevisionFromBuildLabEx(): DWORD;
    var
      sp : TStrSplitter;
    begin
      // begin changed by Christoph
      if (BuildLabEx = '') then begin
        Result := MAXDWORD;
        Exit;
      end;
      // end changed by Christoph
      sp := TStrSplitter.Create;
      try
        try
          sp.Execute(BuildLabEx,'.');
          Result := StrToInt( sp[1] );
        except on E: EConvertError do
          Result := MAXDWORD;
        end;
      finally
        FreeAndNil(sp);
      end;
    end;
Gruß,
Christoph

MaBuSE 15. Jun 2009 10:33

Re: [Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennun
 
Zitat:

Zitat von MagicAndre1981
TWindowsVersionsInfo - Kompo zur Windowserkennung
Da mehrfach danach gefragt wurde hab ich mal die Windowserkennng in eine Klasse gepackt, die per Direktive auch als VLC-Kompo auf die Form geklatscht werden kann.

Hallo,
Die TWindowsVersionsInfo finde ich gut. Ich habe sie in einem kleinen Testprogramm benötigt.

Bei der Benutzung sind mir aber ein paar Kleinigkeiten aufgefallen:
  • Ich finde es immer besser einen Fehler zu vermeiden als auf ihn reagieren zu müssen.
    Wenn Du einen EConvertError erwartest weil sp[1] = '', warum prüfst Du denn nicht vorher auf einen korrekten Wert?
    Besser noch Du schaust Dir an wie IntToStr funktioniert und verwendest Val.

    Ich hätte es wahrscheinlich ja gar nicht bemerkt, aber der Delphi Debugger bleibt natürlich immer bei einer Exception stehen. ( -> sehr nervig und unnötig)

    Delphi-Quellcode:
    ...
    // Deine Funktion
    function GetRevisionFromBuildLabEx(): DWORD;
    var
      sp : TStrSplitter;
    begin
      sp := TStrSplitter.Create;
      try
        try
          sp.Execute(BuildLabEx,'.');
          Result := StrToInt( sp[1] );
        except on E: EConvertError do
          Result := MAXDWORD;
        end;
      finally
        FreeAndNil(sp);
      end;
    end;
    ...

    // Mein Vorschlag
    function GetRevisionFromBuildLabEx(): DWORD;
    var
      sp : TStrSplitter;
      E: Integer;
    begin
      sp := TStrSplitter.Create;
      try
        sp.Execute(BuildLabEx,'.');
        Val(sp[1], Result, E);
        if E <> 0 then Result := MAXDWORD;
      finally
        FreeAndNil(sp);
      end;
    end;
    ...
    [edit]
    Ups, ich sehe gerade, dass dieses Problem schon jemand anderes gepostet hat. (Ich hätte nicht nur den 1. Beitrag lesen sollen). Trotzdem ist mein Vortschlag besser als das if str = '' then ...
    [/edit]


    nonVCL
    Du bietest die Option an mit dem Schalter {.$define USE_VCL} nur ein TObjekt statt einer Komponente zu benutzen.
    Die Idee ist super, Du benötigst dann kein Classes und kein Controls und bist damit quasi nonVCL.
    Delphi-Quellcode:
    uses
      SysUtils,
    {$IFDEF USE_VCL}
      Classes, Controls,
    {$ENDIF}
      Windows ;
    Aber Du bist nicht konsequent. Du verwendest die Unit cruStrSplitter, die natürlich Classes einbindet.
    Damit hast Du dann wieder die ganze VCL eingebunden. :stupid:

    Lösungsvorschlag:
    Nenne Deinen Kompilerschalter einfach um in USE_TCOMPONENT.
    Dann kann sich niemand beschweren.

    oder besser:
    Überarbeite die cruStrSplitter, das diese auch nonVCL wird. Die kleinen *.exe Dateien werden es Dir danken ;-)

Ich hoffe diese Infos helfen Dir dein Projekt noch besser zu machen.

MagicAndre1981 15. Jun 2009 12:23

Re: [Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennun
 
danke für deine Anregungen, ich schau mir das mal an.

MaBuSE 15. Jun 2009 17:41

Re: [Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennun
 
Zitat:

Zitat von MagicAndre1981
danke für deine Anregungen, ich schau mir das mal an.

Ich hab mir das auch noch mal angeschaut.

Du verwendest den cruStrSplitter ja nur um aus String wie '123.456.789.0' die Zahl 456 zu bekommen.
Das geht auch mit Copy und Pos(Ex).
  • Pos bestimmt die Position eines SubStr in einem Str.
    Mit i := Pos('.', BuildLabEx); steht in i die Stelle an der der 1. Punkt steht. Bei 123.456.78... ist das 4
    PosEx bestimmt die Position eines SubStr in einem Str ab der x. Stelle (Offset).
    Mit PosEx('.', BuildLabEx, i) bestimmst Du also wie weit der 2. Punkt nach dem 1. steht.
    Bei 123.456.78 mit Offset 4 ist das 4
    Copy(s,x,y) gibt Dir einen SubStr ab der x. Stelle mit der Länge y zurück.

    Copy(BuildLabEx, i+1, PosEx('.', BuildLabEx, i)-1);
    -> i+1 ist das 1. Zeichen nach dem 1. Punkt
    -> PosEx('.', BuildLabEx, i)-1 ist die Länge des SubStr bis zum 2. Punkt. (-1 da der Punkt ja nicht im SubStr enthalten sein soll)
    -> Gibt also '456' zurück

    Glücklicherweise gibt Pos und PosEx eine 0 zurück wenn nichts gefunden wird.
    -> Copy(s, 1, -1) gibt dann einen Leerstring zurück ''
Delphi-Quellcode:
...
    // Vorschlag ohne StrSplitter Objekt
    function GetRevisionFromBuildLabEx: DWORD;
    var
      s: string;
      i: Integer;
      E: Integer;
    begin
      i := Pos('.', BuildLabEx);
      s := Copy(BuildLabEx, i+1, PosEx('.', BuildLabEx, i)-1); // PosEx ist in Unit StrUtils
      Val(s, Result, E);
      if E <> 0 then Result := MAXDWORD;
    end;
...
Damit kannst Du dann ganz auf dieses Objekt verzichten und bist wieder nonVCL.
Es dürfte auch etwas schneller sein als das Splitter Objekt.

MagicAndre1981 15. Jun 2009 21:18

Re: [Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennun
 
danke, das bau ich dann ein :thumb:

dann kommt noch die Windows 7 / Vista Sp2 / Server 2008 (neue Editionen) Erkennung und dann gibts bald wieder ein Update.

MaBuSE 17. Jun 2009 14:36

Re: [Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennun
 
Zitat:

Zitat von MagicAndre1981
danke, das bau ich dann ein :thumb:

Gern geschehen.

Das ist jetzt etwas offtopic, aber ;-)

http://www.levenez.com/windows/redir...ndows_pdf.html

bzw.

http://www.levenez.com/windows

Viel Spaß
MaBuSE

TUX_der_Pinguin 1. Dez 2009 11:29

Re: [Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennun
 
Zitat:

Zitat von MagicAndre1981
danke, das bau ich dann ein :thumb:

dann kommt noch die Windows 7 / Vista Sp2 / Server 2008 (neue Editionen) Erkennung und dann gibts bald wieder ein Update.

Hi MagicAndre1981,

die Komponente ist echt Super, aber die Frage wäre ob du schon die Zeit gefunden hast die neusten Versionen einzupflegen und ein
Update der Komponente bereitstellen kannst.

Vielen dank

TUX

WojTec 6. Mär 2013 18:34

Re: [Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennung
 
This is very very nice class, but don't support latest Windows. Do you plan update?

rNoob 18. Apr 2016 17:23

AW: [Kompo] TWindowsVersionsInfo - Kompo zur Windowserkennung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe diese Komponente für mich selber vor Kurzem angepasst. Es werden alle Windows 10-Versionen korrekt ausgelesen.
Try-Except's könnte man mal hier und da einbauen und ein paar weitere Überprüfungen. Aber für meinen Fall war das nicht notwendig.

MagicAndre1981 ist ja leider seit 2009 nicht mehr aktiv. Deswegen wurde in den Credits folgendes von mir hinzugefügt:
Zitat:

(* V1.6.0 (18.04.2016) [Diese Änderung wurde NICHT durch MagicAndre1981 vorgenommen - Fehler gelten ggf. also nicht ihm] *)
(* - Erkennung bis Windows 10 *)
(* V1.6.1 (19.04.2016) [Diese Änderung wurde NICHT durch MagicAndre1981 vorgenommen - Fehler gelten ggf. also nicht ihm] *)
(* - cruStrSplitter entfernt *)
(* - "except on E: EConvertError do"-Blöcke entfernt *)
cruStrSplitter wurde durch die Version von MaBuSE ersetzt: http://www.delphipraxis.net/923631-post54.html #54

Wen diese Version interessiert, sie ist im Anhang zu finden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:40 Uhr.
Seite 2 von 2     12   

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