Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Delphi-Versionsnummer per IOTA-Service abfragen? (https://www.delphipraxis.net/207382-delphi-versionsnummer-per-iota-service-abfragen.html)

r29d43 18. Mär 2021 16:09

Delphi-Versionsnummer per IOTA-Service abfragen?
 
Hallo, gibt es eigentlich einen IOTA-Service über den ich die Delphi-Versionsnummer (also z.B. 10.4.1 oder 10.4.2 abfragen kann?

Irgend so ein IOTANotification-Servie o.ä.?

Thx im Voraus.

Delphi.Narium 18. Mär 2021 16:35

AW: Delphi-Versionsnummer per IOTA-Service abfragen?
 
Kenne nur
Delphi-Quellcode:
System.CompilerVersion
und
Delphi-Quellcode:
System.RTLVersion
und dann mit Hilfe der Tabelle Compiler-Versionen übersetzen.

Daniel 18. Mär 2021 17:11

AW: Delphi-Versionsnummer per IOTA-Service abfragen?
 
Eine derartige ToolsAPI dürfte kaum nötig sein, wenn Du eh schon als IDE-Erweiterung aktiv bist, musst Du nur die Versionsnummer Deines Prozesses (bds.exe) abfragen. Dafür reicht dann die Windows-API.

himitsu 18. Mär 2021 18:45

AW: Delphi-Versionsnummer per IOTA-Service abfragen?
 
CompilerVersion selbst reicht nicht immer.
Alle Delphi 10.4.x haben meistens die selbe Compilerversion. (ich glaub nur einmal hatte ein Update eine andere Nummer)

Alle Versionen, die ich kenn:
https://www.delphipraxis.net/205509-...ml#post1473778
Die "const" und die Dateiversion kann auslesen (also über's Prozesshandle).


Aber ja, entweder in der Registry schauen, oder auf der BDS.exe auslesen.

Ich weiß nur grade nicht, ob die OTA den Registry-Pfad nennt, damit man dort im richtigen Pfad lesen kann.
HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\21.0\CatalogRepository\InstallVars : _INSTALL_SM_RADSTUDIOFOLDER
HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\21.0\InstalledUpdates : Main Product Update
HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\21.0\Personalities : *
[add] IOTAServices.GetBaseRegistryKey

r29d43 18. Mär 2021 19:18

AW: Delphi-Versionsnummer per IOTA-Service abfragen?
 
Ich habe das innerhalb des Package gerade mal per GetProcessVersion(0) versucht und bekomme hier bei einem Delphi10.4.2 als DWord-Ergebnis immer die $50000 zurück.

Und was ja wohl irgendwie nicht so ganz richtig sein kann, oder? Wenn Hi-Word = major version number und Lo-Word = minor version number.


Dann in der Registry habe ich unter Computer\HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BD S\21.0\InstalledUpdates aber dieses als Eintrag gefunden: Delphi 10.4 and C++Builder 10.4 Update 2

Und das reicht, ist leicht zu finden und gut weiter zu verarbeiten. Thx.

edit: den Pfad habe ich per regedit und dessen Suchfunktion gefunden.

Zitat:

[add] IOTAServices.GetBaseRegistryKey
und damit wirds natürlich noch etwas einfacher und sicherer

KodeZwerg 18. Mär 2021 20:01

AW: Delphi-Versionsnummer per IOTA-Service abfragen?
 
Les mal was GetProcessVersion() macht :-)

Wenn es unbedingt über ToolsAPI sein soll (Delphi.Narium hats ja schon aufn Punkt gebracht) kannst Du in Deinen Projekt-Configs ein Feld mit einer Nummer bestimmen und per IOTAProjectOptions / IOTAProject zurücklesen. Das ist dann aber Hard-Kodiert, also blödsinn.

Stevie 18. Mär 2021 21:01

AW: Delphi-Versionsnummer per IOTA-Service abfragen?
 
Warum willst du das machen? Ja vermutlich, um gewisse Änderungen zwischen den Versionen abzuhandeln oder? Je nachdem warum, könnte es andere Wege geben.

r29d43 18. Mär 2021 22:09

AW: Delphi-Versionsnummer per IOTA-Service abfragen?
 
Das soll insgesamt ein kleines IOTA-Projekt werden, welches u.a. einen mit '//' beginnenden Kommentar, der hinter dem Zeilenende verschwindet, nochmal automatisch in einem kleinen extra Window anzeigen soll, wenn die Maus länger als eine halbe Sekunde darübersteht. Da ich hierzu aber wissen muss, wo auf den Pixel genau dieser Kommentar beginnt und sich diese beiden Versionen 10.4.1 u. 10.4.2 im Bau des textanzeigenden Windows minimal voneinander unterscheiden, braucht das Package die Info, in welcher der Versionen es gerade läuft.

Und das klappt jetzt über die Registry auch schon einfach und gut genug.

himitsu 18. Mär 2021 22:24

AW: Delphi-Versionsnummer per IOTA-Service abfragen?
 
Dann ist das vorgehen falsch.

Nicht auf versionen prüfen, sondern das auslesen, was man eigentlich wissen will.

Beispiel:
statt auf Delphi 2009 zu prüfen, um zu wissen ob Unicode, kann man auch das Feature prüfen oder nachmessen.

Delphi-Quellcode:
{$IFDEF VER200}
{$IF CompilerVersion >= 20.0}

{$IFDEF UNICODE}
{$IF SizeOf(Char) = 2}
Genauso gibt es bestimmt irgendeinen Weg, um die gewünschte Breite direkt von der Komponente auszulesen.
Oder willst du das für jede IDE-Version wirklich einzeln manuell bestimmen?

stahli 19. Mär 2021 00:09

AW: Delphi-Versionsnummer per IOTA-Service abfragen?
 
@r29d43

Ich bin nicht sicher, aber vielleicht kann Dir INTAEditViewNotifier weiter helfen.
Zumindest könntest Du mal schauen, ob da in der Richtung etwas für Dich passt. Evtl. kommst Du so noch genauer an den Editor heran.

Delphi-Quellcode:
  TViewPaintNotifier = class(TInterfacedObject, IOTANotifier, INTAEditViewNotifier)
  private
  public
    constructor Create;
    destructor Destroy; override;
  public
    // INTAEditViewNotifier
    procedure BeginPaint(const View: IOTAEditView; var FullRepaint: Boolean);
    procedure EditorIdle(const View: IOTAEditView);
    procedure EndPaint(const View: IOTAEditView);
    procedure PaintLine(const View: IOTAEditView; LineNumber: Integer; const LineText: PAnsiChar; const TextWidth: Word;
      const LineAttributes: TOTAAttributeArray; const Canvas: TCanvas; const TextRect: TRect; const LineRect: TRect;
      const CellSize: TSize);
    // IOTANotifier
    procedure AfterSave;
    procedure BeforeSave;
    procedure Destroyed;
    procedure Modified;
  end;

r29d43 19. Mär 2021 08:20

AW: Delphi-Versionsnummer per IOTA-Service abfragen?
 
@himitsu
Das würde ich ja auch liebend gerne so machen, nur habe ich bzgl. der IOTA-Services noch keinen Weg dazu gefunden. Zumal ich ja bzgl. dieser IOTA-Dingens auch noch ziemlich am Anfang bin. Das werde ich dann etwas später schon genau so machen, wenn ich mich mal ein bisschen in diese OpenToolsApi reingewühlt habe. Im Augenblick komme ich aber so schneller voran.


Allerdings, wenn wir eh schon gerade dabei sind, wäre die Frage ansonsten gewesen: Gibt es eine Möglichkeit mittels der IOTA-Services die exakte Position (in Pixel auf dem Screen) des ersten Chars des Quellcodes (also quasi der in Columne 1) festzustellen? Bzw. die Breite festzustellen, zwischen dem linken Rand des Editors (im Zweifel habe ich die Handle des Windows, in dem diese Editoren immer drinliegen (=TEditControl), und kann somit dessen Position per GetWindowPos ermitteln) und dem ersten Char im Editor. Das ist also der Bereich, indem diese Debuggerhaltepunkte eingezeichnet werden oder auch die Zeilennummern. Denn dieser Bereich ist zufälligerweise zwischen Delphi 10.4.1 u. 10.4.2 unterschiedlich breit.


@stahli, danke, auf so einen o.ä. Tipp hätte ich dann gehofft, wenn ich diese Frage dann speziell zur Beseitigung dieses Problems irgendwann später mal gestellt hätte. Ich werde mir das natürlich mal etwas genauer ansehen (habe heute aber leider keine richtige Zeit mehr dazu).

dummzeuch 19. Mär 2021 08:22

AW: Delphi-Versionsnummer per IOTA-Service abfragen?
 
GExperts führt dazu eine Liste der Versionsinfos diverser Executables und BPLs. Die wird benutzt, um diverse Bugs / Features einzelner Updates zu umschiffen. Unit GX_GetIdeVersion im Unterverzeichnis source\framework.

Sieht dann z.B. so aus:

Delphi-Quellcode:
{
  Delphi 10.4 Sydney
  File                File Version   Size      Modified Time
  delphicoreide270.bpl 27.0.37889.9797
  coreide270.bpl      27.0.37889.9797
  bds.exe             27.0.37889.9797
  dcldb270.bpl        27.0.37889.9797

  Patch1 and Patch2 apparently did not change any of these versions and even those files
  the patches replaced still have the same version as the original files. WTF?

  Delphi 10.4.1 Sydney Update 1
  File                File Version   Size      Modified Time
  delphicoreide270.bpl 27.0.38860.1461
  coreide270.bpl      27.0.38860.1461
  bds.exe             27.0.38860.1461
  dcldb270.bpl        27.0.38860.1461

  Delphi 10.4.2 Sydney Update 2
  File                File Version   Size      Modified Time
  delphicoreide270.bpl 27.0.40680.4203
  coreide270.bpl      27.0.40680.4203
  bds.exe             27.0.40680.4203
  dcldb270.bpl        27.0.40680.4203
}

function GetRS104Version: TBorlandIdeVersion;
const
  RegKey = 'Software\Embarcadero\BDS\21.0\CatalogRepository\Elements\10.4Patch2pro-10';
  CoreIde2700:    TVersionNumber = (Minor: 27; Major: 0; Build: 9797; Release: 37829);
  CoreIde2700UPd1: TVersionNumber = (Minor: 27; Major: 0; Build: 1461; Release: 38860);
  CoreIde2700UPd2: TVersionNumber = (Minor: 27; Major: 0; Build: 4203; Release: 40680);
var
  RegValue: Integer;
  CoreIdeFileVersion: TVersionNumber;
begin
  CoreIdeFileVersion := GetFileVersionNumber(GetIdeRootDirectory + 'Bin\coreide270.bpl');

  if CompareVersionNumber(CoreIdeFileVersion, CoreIde2700UPd2) >= 0 then begin
    Result := ideRS104U2;
  end else if CompareVersionNumber(CoreIdeFileVersion, CoreIde2700UPd1) >= 0 then begin
    Result := ideRS104U1;
  end else begin
    // There was patch 2 for 10.4.0 which broke StringGrids in a new way
    // so we have to detect it.
    RegValue := TRegistry_ReadInteger(RegKey, 'Installed', 0, HKEY_CURRENT_USER);
    if RegValue <> 0 then
      Result := ideRS104P2
    else
      Result := ideRS104;
  end;
end;
In der Regel reicht es, wenn man CoreIde prüft, aber bei einigen älteren Versionen wurden durch ein Update / Patch nur einzele wichtige Dateien geändert, so dass man gezielt diese prüfen muss.

Stevie 19. Mär 2021 17:48

AW: Delphi-Versionsnummer per IOTA-Service abfragen?
 
Zitat:

Zitat von r29d43 (Beitrag 1485490)
Gibt es eine Möglichkeit mittels der IOTA-Services die exakte Position (in Pixel auf dem Screen) des ersten Chars des Quellcodes (also quasi der in Columne 1) festzustellen? Bzw. die Breite festzustellen, zwischen dem linken Rand des Editors und dem ersten Char im Editor.

Ja, der Bereich nennt sich "Gutter".

Delphi-Quellcode:
function GetEditorServices: IOTAEditorServices;
begin
  Result := BorlandIDEServices as IOTAEditorServices;
  Assert(Assigned(Result));
end;

function GetTopMostEditView: IOTAEditView;
begin
  Result := GetEditorServices.TopView;
end;

function GetEditor: TWinControl;
var
  view: IOTAEditView;
begin
  view := GetTopMostEditView;
  Result := TWinControl(view.GetEditWindow.Form.FindComponent('Editor'));
end;

function GetGutterWidth: Integer;
var
  editor: TWinControl;
  ctx: TRttiContext;
begin
  editor := GetEditor;
  Result := ctx.GetType(editor.ClassType).GetProperty('LeftGutter').GetValue(editor).AsInteger;
end;

r29d43 19. Mär 2021 20:28

AW: Delphi-Versionsnummer per IOTA-Service abfragen?
 
Zitat:

Zitat von Stevie (Beitrag 1485548)

Ja, der Bereich nennt sich "Gutter".

Delphi-Quellcode:
function GetEditorServices: IOTAEditorServices;
begin
  Result := BorlandIDEServices as IOTAEditorServices;
  Assert(Assigned(Result));
end;

function GetTopMostEditView: IOTAEditView;
begin
  Result := GetEditorServices.TopView;
end;

function GetEditor: TWinControl;
var
  view: IOTAEditView;
begin
  view := GetTopMostEditView;
  Result := TWinControl(view.GetEditWindow.Form.FindComponent('Editor'));
end;

function GetGutterWidth: Integer;
var
  editor: TWinControl;
  ctx: TRttiContext;
begin
  editor := GetEditor;
  Result := ctx.GetType(editor.ClassType).GetProperty('LeftGutter').GetValue(editor).AsInteger;
end;


Oberperfekt! Genau das was ich später dann gesucht hätte und jetzt schon gefunden habe :thumb:

Besten Dank auch nochmal @all :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 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