Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi TThread : Array als Parameter (https://www.delphipraxis.net/109153-tthread-array-als-parameter.html)

bwolf 25. Feb 2008 12:34


TThread : Array als Parameter
 
Hi Leute,

ich möchte ein TThread-Object erstellen und diesem einen Array als Parameter übergeben, in dem ich den construcutor überschreibe:

Delphi-Quellcode:
type TPrintAntrag=class(TThread)
     constructor create(s: array of string);
     protected
      procedure execute; override;
     private
      Fs: array[0..100] of string;
end;



constructor TPrintAntrag.create(s: array of string);
begin
  Fs:=s; // FEHLER : "Incompatible types"
  Freeonterminate:=true;
  inherited create(false);
end;

procedure TPrintAntrag.execute;
begin
  // mach irgendwas
end;


// Befüllen des Arrays und starten des Threads
procedure TForm1.Button1Click(Sender: TObject);
var
  meinArray : array[0..100] of string;
  i : integer;
begin
  for i := 0 to 100 do
    meinArray[i] := intToStr(i);

  TPrintAntrag.create(meinArray);
end;

Problem: bei der Zuweisung Fs:=s; im constructor erhalte ich den Fehler
"[Error] Unit1.pas(102): Incompatible types"

Was mache ich verkehrt?
Danke für eure Hilfe,
gruß ben

Union 25. Feb 2008 12:43

Re: TThread : Array als Parameter
 
Die Fehlermeldung ist schon sehr aussagekräftig: Du versuchst ein dynamisches Array einem Array mit konstanter Länge zuzuweisen.

Sharky 25. Feb 2008 12:44

Re: TThread : Array als Parameter
 
Hai bwolf,

ein Array of String ist ja nicht das selbe wie ein array[0..100] of String.

Das eine ist dynamisch das andere hat eine feste grösse. Ich würde mir einen Typ für das Array anlegen und diesen verwenden.

bwolf 25. Feb 2008 12:52

Re: TThread : Array als Parameter
 
Hi hi und erstmal danke für die wie immer sehr schnellen antworten.

Allerdings verstehe ich eure erklärung nicht ganz :oops:

Delphi-Quellcode:
Fs: array[0..100] of string;
meinArray : array[0..100] of string;
...sind doch beides Arrays mit einer festen länge :gruebel:

Union 25. Feb 2008 12:53

Re: TThread : Array als Parameter
 
Aber den Type hat Du nicht im Constructor angegeben:
Delphi-Quellcode:
constructor create(s: array of string);

Sharky 25. Feb 2008 12:54

Re: TThread : Array als Parameter
 
Code:
type TPrintAntrag=class(TThread)
     constructor create(s: array of string);
     protected
      procedure execute; override;
     private
[b]     Fs: array[0..100] of string; [/b]
end;



constructor TPrintAntrag.create(s: [b]array of string[/b]);
begin
  Fs:=s; // [color=red]FS ist Array[0.100] of String - s ist Array of String[/color]
  Freeonterminate:=true;
  inherited create(false);
end;
Edit: Der Union drängelt sich immer vor :cry:

bwolf 25. Feb 2008 12:59

Re: TThread : Array als Parameter
 
ok, danke...

Also die einfachste Möglichkeit ist, ein Typ für das Array anzulegen, oder was gäbe es noch für möglichkeiten?

Union 25. Feb 2008 13:06

Re: TThread : Array als Parameter
 
Ich würde in einem Thread nicht mit direkter Zuweisung arbeiten. Besser wäre der Übertrag des Quellarrays an das Array im Thread:
Delphi-Quellcode:
type TStringArray : Array of string;
...
private
  Fs : TStringArray;
...
constructor TPrintArray.Create(AInputArray : TStringArray);
var
  i;
begin
  inherited Create(True);  // Suspended starten und
  FreeOnTerminate := True; // erst dann auf properties zugreifen
  SetLength(Fs, Length(AInputArray))
  for i := Low(AInputArray) to high(AInputArray) do
    Fs[i] := AInputArray[i];
  // Hier dann den Thread starten
  Resume;
end;
Und der inherited Aufruf MUSS zuerst kommen sonst knallts.

sirius 25. Feb 2008 13:09

Re: TThread : Array als Parameter
 
Zitat:

Zitat von Union
Und der inherited Aufruf MUSS zuerst kommen sonst knallts.

Das stimmt zwar nicht. Aber schaden tut es auch nicht.

Macci 25. Feb 2008 14:06

Re: TThread : Array als Parameter
 
Zitat:

Zitat von bwolf
ok, danke...

Also die einfachste Möglichkeit ist, ein Typ für das Array anzulegen, oder was gäbe es noch für möglichkeiten?

Mit einem Pointer müsste es auch gehen :-)
Eine wichtige Frage ist aber: Willst du das Array während dem Thread verändern? Wenn ja, wie sollen sich die Änderungen auswirken?


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