Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Unit zu unbekanntem Variablentype gesucht (generell) (https://www.delphipraxis.net/214895-unit-zu-unbekanntem-variablentype-gesucht-generell.html)

NoGAD 31. Mär 2024 08:40

Unit zu unbekanntem Variablentype gesucht (generell)
 
Hallo,

euch ist es sicherlich auch schon einmal passiert, dass ihr (selbst hier in DP) einen Codeschnipsel gefunden habt, der ohne Uses-Klausel daherkommt.

Wenn jetzt ein unbekannter Typ deklariert wird, suche ich meistens per Google danach.

Im Moment habe ich einen Type, den ich nirgendwo finden kann.

Wie findet man im Normalfall die entsprechende Unit?

Hat bitte jemand die passende Unit zum Type:

Delphi-Quellcode:
var
  Sync: TSync;
LG und frohe Ostern :-)
Mathias

Olli73 31. Mär 2024 08:52

AW: Unit zu unbekanntem Variablentype gesucht (generell)
 
Scheint was selbst abgeleitetes von TIdSync zu sein.

https://stackoverflow.com/questions/...er-sometimeout

Andreas13 31. Mär 2024 09:44

AW: Unit zu unbekanntem Variablentype gesucht (generell)
 
... und TIdSync ist bei mir (XE5) in

C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\source\Indy10\Core\IdSync.pas

deklariert.

Der schöne Günther 31. Mär 2024 09:48

AW: Unit zu unbekanntem Variablentype gesucht (generell)
 
Du kannst meist mit der Tastenkombo Strg+Shift+A die IDE selbst versuchen lassen, die richtige Unit dafür zu finden. Meist gibt das in den ersten zwei Anläufen eine nichtssagende Fehlermeldung, aber bei mir klappt es lustigerweise beim dritten oder fünften Anlauf relativ oft.

Andreas13 31. Mär 2024 10:06

AW: Unit zu unbekanntem Variablentype gesucht (generell)
 
Bei mir (XE5) liefert die Tastenkombination Strg+Shift+A eine (oft "kilometerlange") Liste aller (auch indirekt) verwendeten Units... :(

Delphi.Narium 31. Mär 2024 17:56

AW: Unit zu unbekanntem Variablentype gesucht (generell)
 
Ich drücke bei Delphi 7 einfach F1 und schau in der Hilfe nach. Wenn die es nicht weiß, ist es was "nicht normales", also von außerhalb von dem, was Delphi von Haus aus mitliefert.

Da bei mir alle Delphisourcen unterhalb eines Verzeichnisses liegen, ordentlich geordnet nach Projekten, Komponenten, eigenes, fremdes, ... nutze ich einfach die Suchfunktion vom Windowscommander (oder 'nem beliebigen Klone) und lass den in allen *.pas-Dateien suchen. Werde so immer fündig oder das Gesuchte gibt es bei mir (noch) nicht.

Oder Kommandozeile:
Code:
@for /f %i in ('dir /s /b *.pas') do @find "TSync" "%i"
per Grep (für ein Verzeichnis):
Code:
c:\delphi7\bin\grep "TSync" c:\delphi\*.pas
per Grep (für eine Verzeichnisstruktur):
Code:
@for /f %i in ('dir /AD /s /b') do @c:\delphi7\bin\grep "TSync" "%i\*.pas" 1>>c:\temp\Fundstellen.txt 2>>nul

NoGAD 31. Mär 2024 18:48

AW: Unit zu unbekanntem Variablentype gesucht (generell)
 
Vielen lieben Dank für eure Hilfe.

Die Ableitung von TIdSync hatte ich auch gefunden, der Zusammenhang wollte mir aber nicht richtig einleuchten.

Hier noch einmal etwas mehr Code:

Delphi-Quellcode:
type
  TMyJSON = record
    TotalItems: Integer;
    Items: TJSONArray;
    ItemsArray: Array of TJSon_Items;
    Result: Boolean;
  end;

var
  MyJSON: TMyJSON;
  MyJSONArray: TArray<TMyJSON>;
  Dummy_Count: Integer;
  Tasks: TList<TTask>;
  Sync: TSync;

procedure SearchGoogleSingleISBNTask(const Dummy_String: string);
var
  MyJSON: TMyJSON;
begin
  MyJSON := SearchGoogleSingleISBN(Dummy_String);
  // ...weitere Verarbeitung von MyJSON...
end;

begin
  Dummy_Count := ListBox1.Count - 1;
  SetLength(MyJSONArray, Dummy_Count);
  Sync := TSync.Create;

  uses System.SyncObjects; // Add this line

  for Dummy_Int := Dummy_Count downto 0 do
  begin
    while Tasks.Count >= 5 do
      Sync.WaitFor;

    TTask.Create(
      procedure
      begin
        SearchGoogleSingleISBNTask(ListBox1.Items[Dummy_Int]);
        Sync.Signal;
      end
    ).Start;
    Tasks.Add(TTask.Last);
  end;

  // Warten auf Abschluss aller Tasks
  while Tasks.Count > 0 do
    Sync.WaitFor;

  // ...Datenbankaktualisierung...
  for Dummy_Int := 0 to Dummy_Count do
  begin
    MyJSON := MyJSONArray[Dummy_Int];
    if MyJSON.TotalItems = 1 then
      // ...hier Code zur Datenbankaktualisierung...
  end;
end;

Delphi.Narium 1. Apr 2024 08:59

AW: Unit zu unbekanntem Variablentype gesucht (generell)
 
Die KI meiner Wahl hat dazu folgendes zu vermelden:
Zitat:

Zitat von Frage
Können Sie mir für Delphi die Unit benennen, in der die Klasse TSync definiert ist?

Zitat:

Zitat von Antwort
Entschuldigung, aber ich konnte keine spezifische Delphi-Unit finden, in der die Klasse TSync definiert ist. Es könnte sein, dass diese Klasse in einer benutzerdefinierten Unit definiert ist oder in einer weniger bekannten oder veralteten Delphi-Unit. Es wäre hilfreich, wenn Sie weitere Details oder den Kontext bereitstellen könnten, in dem Sie diese Klasse verwenden. Bitte überprüfen Sie auch die Dokumentation oder den Quellcode, wenn Sie Zugriff darauf haben.

Quelle: Unterhaltung mit Bing, 1.4.2024
(1) delphi - How do you create a class in one unit, and use it as a return .... https://stackoverflow.com/questions/...-in-another-un.
(2) Programme und Units (Delphi) – RAD Studio. https://docwiki.embarcadero.com/RADS...amme_und_Units.
(3) Klassen und Objekte (Delphi) – RAD Studio. https://docwiki.embarcadero.com/RADS...e_%28Delphi%29.

Zitat:

Zitat von Frage
Mir ist in dem Zusammenhang nur der nachfolgende Quelltext bekannt:

Delphi-Quellcode:
type
  TMyJSON = record
    TotalItems: Integer;
    Items: TJSONArray;
    ItemsArray: Array of TJSon_Items;
    Result: Boolean;
  end;

var
  MyJSON: TMyJSON;
  MyJSONArray: TArray<TMyJSON>;
  Dummy_Count: Integer;
  Tasks: TList<TTask>;
  Sync: TSync;

procedure SearchGoogleSingleISBNTask(const Dummy_String: string);
var
  MyJSON: TMyJSON;
begin
  MyJSON := SearchGoogleSingleISBN(Dummy_String);
  // ...weitere Verarbeitung von MyJSON...
end;

begin
  Dummy_Count := ListBox1.Count - 1;
  SetLength(MyJSONArray, Dummy_Count);
  Sync := TSync.Create;

  uses System.SyncObjects; // Add this line

  for Dummy_Int := Dummy_Count downto 0 do
  begin
    while Tasks.Count >= 5 do
      Sync.WaitFor;

    TTask.Create(
      procedure
      begin
        SearchGoogleSingleISBNTask(ListBox1.Items[Dummy_Int]);
        Sync.Signal;
      end
    ).Start;
    Tasks.Add(TTask.Last);
  end;

  // Warten auf Abschluss aller Tasks
  while Tasks.Count > 0 do
    Sync.WaitFor;

  // ...Datenbankaktualisierung...
  for Dummy_Int := 0 to Dummy_Count do
  begin
    MyJSON := MyJSONArray[Dummy_Int];
    if MyJSON.TotalItems = 1 then
      // ...hier Code zur Datenbankaktualisierung...
  end;
end;
Zitat:

Zitat von Fortsetzung der Frage
Können Sie damit etwas anfangen oder ist das bei der Suche hilfreich?

Zitat:

Zitat von Antwort
Ja, das ist sehr hilfreich. In Ihrem Code verwenden Sie die Klasse 'TSync' aus der Unit 'System.SyncObjects'. Diese Klasse ist Teil der Delphi-Standardbibliothek und wird für die Synchronisation von Threads in einer Multithread-Anwendung verwendet².

In Ihrem speziellen Fall wird 'TSync' verwendet, um die Ausführung von parallelen Tasks zu koordinieren. Die Methode 'WaitFor' blockiert die Ausführung des Hauptthreads, bis ein Signal von einem der parallelen Tasks empfangen wird, das durch die Methode 'Signal' gesendet wird. Dies stellt sicher, dass der Hauptthread auf den Abschluss aller parallelen Tasks wartet, bevor er fortfährt.

Bitte beachten Sie, dass Sie die Unit 'System.SyncObjects' in den Uses-Klauseln am Anfang Ihrer Unit hinzufügen müssen, nicht innerhalb der Prozedur oder Funktion. Hier ist der korrigierte Code:

Delphi-Quellcode:
uses
  System.SyncObjects; // Move this line to the top

type
  TMyJSON = record
    TotalItems: Integer;
    Items: TJSONArray;
    ItemsArray: Array of TJSon_Items;
    Result: Boolean;
  end;

var
  MyJSON: TMyJSON;
  MyJSONArray: TArray<TMyJSON>;
  Dummy_Count: Integer;
  Tasks: TList<TTask>;
  Sync: TSync;

procedure SearchGoogleSingleISBNTask(const Dummy_String: string);
var
  MyJSON: TMyJSON;
begin
  MyJSON := SearchGoogleSingleISBN(Dummy_String);
  // ...weitere Verarbeitung von MyJSON...
end;

begin
  Dummy_Count := ListBox1.Count - 1;
  SetLength(MyJSONArray, Dummy_Count);
  Sync := TSync.Create;

  for Dummy_Int := Dummy_Count downto 0 do
  begin
    while Tasks.Count >= 5 do
      Sync.WaitFor;

    TTask.Create(
      procedure
      begin
        SearchGoogleSingleISBNTask(ListBox1.Items[Dummy_Int]);
        Sync.Signal;
      end
    ).Start;
    Tasks.Add(TTask.Last);
  end;

  // Warten auf Abschluss aller Tasks
  while Tasks.Count > 0 do
    Sync.WaitFor;

  // ...Datenbankaktualisierung...
  for Dummy_Int := 0 to Dummy_Count do
  begin
    MyJSON := MyJSONArray[Dummy_Int];
    if MyJSON.TotalItems = 1 then
      // ...hier Code zur Datenbankaktualisierung...
  end;
end;
Zitat:

Zitat von Fortsetzung der Antwort
Ich hoffe, das hilft! Wenn Sie weitere Fragen haben, lassen Sie es mich bitte wissen.

Quelle: Unterhaltung mit Bing, 1.4.2024
(1) System.SyncObjs.TSynchroObject - RAD Studio API Documentation. https://docwiki.embarcadero.com/Libr...TSynchroObject.
(2) Why TSync(Time Synchronization) is needed in Adaptive AUTOSAR?. https://stackoverflow.com/questions/...aptive-autosar.
(3) Specification of Time Synchronization - AUTOSAR. https://www.autosar.org/fileadmin/st...ronization.pdf.

Der Fehler liegt in der Zeile des Quelltextes, die mich sofort stutzig gemacht hat: Das Uses mitten im Quelltext.

NoGAD 2. Apr 2024 08:09

AW: Unit zu unbekanntem Variablentype gesucht (generell)
 
Hallo nochmal :-)

Danke @Delphi.Narium. Leider scheint die KI nicht ganz richtig zu liegen. Bei mir (Delphi 10.4) gibt es keine Unit System.SyncObjects

Es gibt eine System.SyncObjs, aber die scheint auch keine Deklaration vom Type TSync zu kennen.

Weiterhin habe ich bei meinem Beispielcode vergessen, zu erwähnen, dass mein Type TMyJSON in einer anderen unit liegt. Somit hatte ich einfach den Code aus zwei unterschiedlichen Bereichen zusammengefasst. Auch die Variablen liegen innerhalb einer Procedure, sind also nicht global definiert.

Tut mir leid für das Missverständnis.

LG :-)

jaenicke 2. Apr 2024 08:18

AW: Unit zu unbekanntem Variablentype gesucht (generell)
 
Zitat:

Zitat von NoGAD (Beitrag 1535184)
Leider scheint die KI nicht ganz richtig zu liegen. Bei mir (Delphi 10.4) gibt es keine Unit System.SyncObjects

Die Unit hat die KI einfach aus deinem Quelltext genommen. Anhand des Namespaces ergab dann die Analyse, dass es eine RTL-Unit sein muss, auch wenn die KI diese vorher nicht kannte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:37 Uhr.
Seite 1 von 2  1 2      

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