AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

abwärtskompatibler unit zugriff

Ein Thema von KodeZwerg · begonnen am 15. Jan 2022 · letzter Beitrag vom 17. Jan 2022
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

abwärtskompatibler unit zugriff

  Alt 15. Jan 2022, 05:57
Delphi-Version: 5
Hallo, in einer unit überschreibe ich den Aufruf einer anderen methode

Ich muss also den genutzten "uses" namen wissen um das original aufzurufen.

Wie realisiere ich das?

Hier mein Problem als Quelltext:
(stellt euch vor "foobar" gibt es tatsächlich auch in sysutils für dieses beispiel)

Delphi-Quellcode:
// so funktioniert es gut Beispiel:
{$IF CompilerVersion >= 23}
  {$DEFINE NameSpace}
{$ENDIF}

uses
  {$IF DEFINED(NameSpace)}System.SysUtils;{$ELSE}SysUtils;{$ENDIF}

function Foobar: Boolean;
begin
  {$IF DEFINED(NameSpace)}
    System.SysUtils.Foobar;
  {$ELSE}
    SysUtils.Foobar;
  {$ENDIF}
end;
Delphi-Quellcode:
// in diese, fall scheitert es
{$IF CompilerVersion >= 23}
  {$DEFINE NameSpace}
{$ENDIF}

uses
  SysUtils;

function Foobar: Boolean;
begin
  {$IF DEFINED(NameSpace)}
    // der name kann nicht aufgelöst werden
    System.SysUtils.Foobar;
  {$ELSE}
    SysUtils.Foobar;
  {$ENDIF}
end;
Kann ich testen/herausfunden wie der programmierer die uses klausel angewandt hat?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.034 Beiträge
 
Delphi 12 Athens
 
#2

AW: abwärtskompatibler unit zugriff

  Alt 15. Jan 2022, 09:16
Ich bin ja schreibfaul und finde es mit ELSE einfach unleserlich sinnlos zu lang. Und das DEFINED() lenkt auch nochmal vom Eigentlichen ab.
Delphi-Quellcode:
uses {$IFDEF NameSpace}System.{$ENDIF}SysUtils;

{$IFDEF NameSpace}System.{$ENDIF}SysUtils.Foobar;



Es wäre zu praktisch, wenn Delphi endlich mal (einfache/kurze) Makros lernen würde, aber der Hersteller weigert sich vehement.
Mein Vorschlag wäre ja sowas wie
Delphi-Quellcode:
{$IF CompilerVersion >= 23}
  {$MACRO NSSystem 'SysUtils.'}  // oder {$DEFINEMACRO NSSystem 'SysUtils.'}
{$ENDIF}

uses {$NSSystem}SysUtils; // oder {$M NSSystem} oder {$MACRO NSSystem}
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Jan 2022 um 09:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.596 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: abwärtskompatibler unit zugriff

  Alt 15. Jan 2022, 11:33
Eigentlich sollte SysUtils alleine schon ausreichen, denn üblicherweise werden doch die Unit Scope Names von der IDE passend gesetzt.

Nervig wird es nur, wenn die IDE an den Uses-Listen herumfummelt.

Hilfreich sind auch die Unit Aliases, wenn sich die Namen von Units geändert haben, z.B. ActionList=ActnList (das dann für ältere Delphis verwenden, die ActionList noch nicht kannten). Dasselbe gilt, wenn irgendwelche Funktionen in andere Units verschoben werden.

Ich versuche in meinen Programmen (und insbesonder GExperts) in der Regel ohne solche IFDEF-Orgien auszukommen, weil es der Lesbarkeit sehr schnell abträglich wird.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: abwärtskompatibler unit zugriff

  Alt 15. Jan 2022, 13:13
An himitsu, der Quelltext muss Delphi und FPC standhalten.

Ich habe halt das Problem das manche Nutzer "uses SysUtils" verwenden und mein "Qual"-Text dann händisch bearbeitet werden muss.

Das würde ich halt gerne elegant lösen nur weiß ich noch nicht wie. Das mit dem Makro ist neuland für mich, ich werde es testen.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: abwärtskompatibler unit zugriff

  Alt 15. Jan 2022, 13:20
Eigentlich sollte SysUtils alleine schon ausreichen
Das bestreite ich ja auch nicht.

Mein problem ist halt das je nach dem wie die uses aussieht muss auch mein $define inhalt aussehen.
Ich habe keinen einfluß auf den uses part nur auf meinen quelltext.

Ein nachvollziehbares Beispiel:
Delphi-Quellcode:
program Test;

{$IF CompilerVersion >= 23}
  {$DEFINE NameSpace}
{$ENDIF}

uses
// {$IF DEFINED(NameSpace)}System.SysUtils;{$ELSE}SysUtils;{$ENDIF}
 SysUtils;

procedure Sleep(const Value: Int64);
begin
  {$IF DEFINED(NameSpace)}
    System.SysUtils.Sleep(Value);
  {$ELSE}
    SysUtils.Sleep(Value);
  {$ENDIF}
end;

begin
  WriteLn('Sleeping');
  Sleep(100);
  WriteLn('Awake');
  ReadLn;
end.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: abwärtskompatibler unit zugriff

  Alt 16. Jan 2022, 18:55
Ich habe gefunden was ich benötige indem ich in der RTTI.pas gesucht habe und dies dabei rausgekommen ist.
Auch habe ich beim Testen festgestellt (wie dummzeuch schrieb) das intern anscheinend immer der volle Name genutzt wird.

Vielleicht kann es ja jemand woanders gebrauchen. (es wird keine unit im uses benötigt für diese routine)

Delphi-Quellcode:
programm Test;

uses
  System.SysUtils; // nur eingebunden für das Beispiel,
                   // die methode UnitExists() benötigt nichts.

function UnitExists(const UnitName: String): Boolean;
  function LowerCase(const S: string): string;
  var
    I, Len: Integer;
    DstP, SrcP: PChar;
    Ch: Char;
  begin
    Len := Length(S);
    SetLength(Result, Len);
    if Len > 0 then
    begin
      DstP := PChar(Pointer(Result));
      SrcP := PChar(Pointer(S));
      for I := Len downto 1 do
        begin
          Ch := SrcP^;
          case Ch of
            'A'..'Z': Ch := Char(Word(Ch) or $0020);
          end;
          DstP^ := Ch;
          Inc(DstP);
          Inc(SrcP);
        end;
    end;
  end;

  procedure PeekData(var P: PByte; var Data; Len: Integer);
  begin
    Move(P^, Data, Len);
  end;

  procedure ReadData(var P: PByte; var Data; Len: Integer);
  begin
    PeekData(P, Data, Len);
    Inc(P, Len);
 end;

  function ReadU8(var P: PByte): Byte;
  begin
    ReadData(P, Result, SizeOf(Result));
  end;

  function _UTF8ToString(P: pointer): string;
  var
    Len: Byte;
    Buf: Array of Byte;
  begin
    Result := '';
    Len := PByte(P)^;
    if Len <> 0 then
      begin
        SetLength(Buf, Len+1);
        Move(PByte(P)^, Buf[0], Len+1);
        Result := UTF8ToString(Buf);
      end;
  end;

  function ReadShortString(var P: PByte): string;
  var
    len: Integer;
  begin
    Result := _UTF8ToString(P);
    len := ReadU8(P);
    Inc(P, len);
  end;

  function IsLoaded(const UnitName: String): Boolean;
  var
    p: PByte;
    i: Integer;
    s: String;
  begin
    Result := False;
    if (UnitName = '') then
      Exit;
    s := LowerCase(UnitName);
    p := Pointer(System.LibModuleList.TypeInfo.UnitNames);
    for i := 0 to System.LibModuleList.TypeInfo.UnitCount - 1 do
      if (s = LowerCase(ReadShortString(p))) then
        begin
          Result := True;
          Break;
        end;
  end;

begin // UnitExists()
  Result := IsLoaded(UnitName);
end; // UnitExists()


// und so überlade ich es nun
// damit bekomme ich keinen "Kann Name nicht auflösen" Fehler obwohl nun beides als ausführbarer Kode enthalten ist.
procedure Sleep(const MSec: DWORD);
begin
  if UnitExists('System.SysUtils') then
    System.SysUtils.Sleep(MSec)
    else
    SysUtils.Sleep(MSec);
end;

begin
  Sleep(150);
end.
Gruß vom KodeZwerg

Geändert von KodeZwerg (16. Jan 2022 um 23:29 Uhr) Grund: Beispiel hinzugefügt.und mehrmals verbessert :-)
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
589 Beiträge
 
Delphi XE6 Enterprise
 
#7

AW: abwärtskompatibler unit zugriff

  Alt 17. Jan 2022, 10:36
Und das geht sowohl in Delphi als auch in Lazarus?
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.203 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: abwärtskompatibler unit zugriff

  Alt 17. Jan 2022, 10:54
Ääääh. Du hattest doch ein Compile-Problem. Das ist Laufzeit. Was übersehe ich?
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: abwärtskompatibler unit zugriff

  Alt 17. Jan 2022, 12:37
Und das geht sowohl in Delphi als auch in Lazarus?
Es ist komisch, es funktioniert nur wenn ich es in der .dpr anwende, in units bekomme ich wieder den Fehler, naja, ich bin wieder am weiterforschen

Es würde bei FPC nicht zum tragen kommen da FPC (noch) keine Prefixe hat. Angewandt bei mir wird es nur wenn Delphi der Motor ist. " {$IF NOT DEFINED(FPC)} "
Gruß vom KodeZwerg

Geändert von KodeZwerg (17. Jan 2022 um 12:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: abwärtskompatibler unit zugriff

  Alt 17. Jan 2022, 12:39
Ääääh. Du hattest doch ein Compile-Problem. Das ist Laufzeit. Was übersehe ich?
Ja, es lässt mich nicht kompilieren. Du hast nichts übersehen aber ich wahrscheinlich einen Denkfehler
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:47 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