Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi die aufzurufende funktion wurde vom linker entfernt (https://www.delphipraxis.net/192566-die-aufzurufende-funktion-wurde-vom-linker-entfernt.html)

EWeiss 1. Mai 2017 15:04

die aufzurufende funktion wurde vom linker entfernt
 
Ja so einen Thread gibt es schon ;)
Bekomme langsam die Krise hier.

So eine Meldung hatte ich vorher noch nie.
Dadurch bedingt funktioniert die Classe nicht mehr.
Delphi-Quellcode:
unit uSprite;

interface
uses Windows, Classes, Messages, SysUtils, Graphics, uGlobal, SKAeroAPI;

const
  ID_LEFT      = -1;
  ID_RIGHT     = -2;
  ID_FLARE     = -3;
  ID_BLUEFLARE = -4;
  ID_FOCUS     = -5;
  SCALE_DEFAULT = 80;
  SCALE_MAX    = 105;
  SCALE_STEP   = 2;
  LBOUND       = ID_FOCUS;

type
  TSprite = class(TObject)
  private
    FX: Integer;
    FY: Integer;
    FW: Integer;
    FH: Integer;
    FScale: Integer;
    FOpacity: Byte;
    FShellTo: string;
    FIconPath: PWideChar;
    FWorkDir: PWideChar;
    FUseLabel: string;
    FCmdLine: PWideChar;
    FShowCmd: LongInt;
    FBitmap: HBitmap;
    FVisible: Bool;
    function getH: Integer;
    function getW: Integer;
    function getX: Integer;
    function getY: Integer;
    procedure setH(const Value: Integer);
    procedure setW(const Value: Integer);
    procedure setX(const Value: Integer);
    procedure setY(const Value: Integer);
    function GetBitmap: HBitmap;
    function GetCmdLine: PWideChar;
    function GetIconPath: PWideChar;
    function GetOpacity: Byte;
    function GetScale: Integer;
    function GetShellTo: string;
    function GetShowCmd: LongInt;
    function GetUseLabel: string;
    function GetVisible: Bool;
    function GetWorkDir: PWideChar;
    procedure SetBitmap(const Value: HBitmap);
    procedure SetCmdLine(const Value: PWideChar);
    procedure SetIconPath(const Value: PWideChar);
    procedure SetOpacity(const Value: Byte);
    procedure SetScale(const Value: Integer);
    procedure SetShellTo(const Value: string);
    procedure SetShowCmd(const Value: LongInt);
    procedure SetUseLabel(const Value: string);
    procedure SetVisible(const Value: Bool);
    procedure SetWorkDir(const Value: PWideChar);
  public
    property x: Integer read getX write setX;
    property y: Integer read getY write setY;
    property w: Integer read getW write setW;
    property h: Integer read getH write setH;
    property Scale: Integer read GetScale write SetScale;
    property Opacity: Byte read GetOpacity write SetOpacity;
    property ShellTo: string read GetShellTo write SetShellTo;
    property IconPath: PWideChar read GetIconPath write SetIconPath;
    property WorkDir: PWideChar read GetWorkDir write SetWorkDir;
    property UseLabel: string read GetUseLabel write SetUseLabel;
    property CmdLine: PWideChar read GetCmdLine write SetCmdLine;
    property ShowCmd: LongInt read GetShowCmd write SetShowCmd;
    property Bitmap: HBitmap read GetBitmap write SetBitmap;
    property Visible: Bool read GetVisible write SetVisible;
  end;

  TNegativeArray = class(TObject)
  private
    Fdata : array of TSprite;
    FMaxValue: Integer;
    function getData(index : Integer) : TSprite; inline;
    procedure setData(index : Integer; aData : TSprite); inline;
    function GetMaxValue: Integer;
    procedure SetMaxValue(const Value: Integer);
  public
    Constructor Create(aLenght : Integer);
    Destructor Destroy; override;

    property Data[index: Integer]: TSprite read getData write setData; default;
    property MaxValue: Integer read GetMaxValue write SetMaxValue;
  end;

var
  gs: TNegativeArray;

implementation

{ TSprite }

function TSprite.GetBitmap: HBitmap;
begin

  Result := FBitmap;
end;

function TSprite.GetCmdLine: PWideChar;
begin

  Result := FCmdLine;
end;

function TSprite.getH: Integer;
begin

  Result := FH;
end;

function TSprite.GetIconPath: PWideChar;
begin

  Result := FIconPath;
end;

function TSprite.GetOpacity: Byte;
begin

  Result := FOpacity;
end;

function TSprite.GetScale: Integer;
begin

  Result := FScale;
end;

function TSprite.GetShellTo: string;
begin

  Result := FShellTo;
end;

function TSprite.GetShowCmd: LongInt;
begin

  Result := FShowCmd;
end;

function TSprite.GetUseLabel: string;
begin

  Result := FUseLabel;
end;

function TSprite.GetVisible: Bool;
begin

  Result := FVisible;
end;

function TSprite.getW: Integer;
begin

  Result := FW;
end;

function TSprite.GetWorkDir: PWideChar;
begin

  Result := FWorkDir;
end;

function TSprite.getX: Integer;
begin

  Result := FX;
end;

function TSprite.getY: Integer;
begin

  Result := FY;
end;

procedure TSprite.SetBitmap(const Value: HBitmap);
begin

  FBitmap := Value;
end;

procedure TSprite.SetCmdLine(const Value: PWideChar);
begin

  FCmdLine := Value;
end;

procedure TSprite.setH(const Value: Integer);
begin

  FH := Value;
end;

procedure TSprite.SetIconPath(const Value: PWideChar);
begin

  FIconPath := Value;
end;

procedure TSprite.SetOpacity(const Value: Byte);
begin

  FOpacity := Value;
end;

procedure TSprite.SetScale(const Value: Integer);
begin

  FScale := Value;
end;

procedure TSprite.SetShellTo(const Value: string);
begin

  FShellTo := Value;
end;

procedure TSprite.SetShowCmd(const Value: LongInt);
begin

  FShowCmd := Value;
end;

procedure TSprite.SetUseLabel(const Value: string);
begin

  FUseLabel := Value;
end;

procedure TSprite.SetVisible(const Value: Bool);
begin

  FVisible := Value;
end;

procedure TSprite.setW(const Value: Integer);
begin

  FW := Value;
end;

procedure TSprite.SetWorkDir(const Value: PWideChar);
begin

  FWorkDir := Value;
end;

procedure TSprite.setX(const Value: Integer);
begin

  FX := Value;
end;

procedure TSprite.setY(const Value: Integer);
begin

  FY := Value;
end;

{ TNegativeArray }

constructor TNegativeArray.Create(aLenght: Integer);
begin

  MaxValue := IIF(aLenght > 6, aLenght, 0);
  SetLength(fdata, aLenght);
end;

destructor TNegativeArray.Destroy;
begin

  inherited;
end;

function TNegativeArray.getData(index: Integer): TSprite;
begin
  assert(index <= 0);
  result := fData[abs(index)];
end;

function TNegativeArray.GetMaxValue: Integer;
begin

  Result := FMaxValue;
end;

procedure TNegativeArray.setData(index: Integer; aData: TSprite);
begin
  assert(index <= 0);
  fData[abs(index)] := aData;
end;

procedure TNegativeArray.SetMaxValue(const Value: Integer);
begin

  FMaxValue := Value;
end;

end.
warum wird setData und getData vom Linker ausgeschlossen?

Optimierung ist ausgeschaltet.

gruss

Mavarik 1. Mai 2017 15:10

AW: die aufzurufende funktion wurde vom linker entfernt
 
Rufst Du die den von irgendwo auf?

EWeiss 1. Mai 2017 15:14

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von Mavarik (Beitrag 1369618)
Rufst Du die den von irgendwo auf?

Delphi-Quellcode:
  gs := TNegativeArray.Create(6);

  gS[0].Bitmap := SKAERO_CreateBitmapFromFile(FolderResource + 'UseBack.png', width, height);
  gS[0].w := width;
  gS[0].h := height;
  gS[0].x := 0;
  gS[0].y := MAX(YMIN_SIZE - gS[0].h, 0);
  gS[0].opacity := 255;
FBitmap und die anderen Zuweisungen gehen nicht mehr weil der Linker set und getData entfernt hat.
Delphi-Quellcode:

constructor TNegativeArray.Create(aLenght: Integer);
begin

  MaxValue := IIF(aLenght > 6, aLenght, 0);
  SetLength(fdata, aLenght);
end;
fdata ?
Oder wo liegt der Fehler?

gruss

Olli73 1. Mai 2017 15:37

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von EWeiss (Beitrag 1369619)
Delphi-Quellcode:
  gs := TNegativeArray.Create(6);

  gS[0].Bitmap := SKAERO_CreateBitmapFromFile(FolderResource + 'UseBack.png', width, height);
  gS[0].w := width;
  gS[0].h := height;
  gS[0].x := 0;
  gS[0].y := MAX(YMIN_SIZE - gS[0].h, 0);
  gS[0].opacity := 255;

Ein
Delphi-Quellcode:
gs[0] := TSprite.Create;
machst du aber schon irgendwo?

EWeiss 1. Mai 2017 15:47

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von Olli73 (Beitrag 1369623)
Zitat:

Zitat von EWeiss (Beitrag 1369619)
Delphi-Quellcode:
  gs := TNegativeArray.Create(6);

  gS[0].Bitmap := SKAERO_CreateBitmapFromFile(FolderResource + 'UseBack.png', width, height);
  gS[0].w := width;
  gS[0].h := height;
  gS[0].x := 0;
  gS[0].y := MAX(YMIN_SIZE - gS[0].h, 0);
  gS[0].opacity := 255;

Ein
Delphi-Quellcode:
gs[0] := TSprite.Create;
machst du aber schon irgendwo?

Nein mache ich nicht.

gruss

Olli73 1. Mai 2017 15:51

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von EWeiss (Beitrag 1369624)
Zitat:

Zitat von Olli73 (Beitrag 1369623)

Ein
Delphi-Quellcode:
gs[0] := TSprite.Create;
machst du aber schon irgendwo?

Nein mache ich nicht.

Wo soll die Objektinstanz dann herkommen?

EWeiss 1. Mai 2017 16:02

AW: die aufzurufende funktion wurde vom linker entfernt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Olli73 (Beitrag 1369625)
Zitat:

Zitat von EWeiss (Beitrag 1369624)
Zitat:

Zitat von Olli73 (Beitrag 1369623)

Ein
Delphi-Quellcode:
gs[0] := TSprite.Create;
machst du aber schon irgendwo?

Nein mache ich nicht.

Wo soll die Objektinstanz dann herkommen?

Jo schon richtig..
Nur dann müsste ich für jede FData[abs(index)] die Classe TSprite erstellen.
Irgendwie ist die Classe so nicht verwendbar. Hmmm..
So wie die aufgebaut ist kann ich NUR Negative werte inklusive 0 verwenden.
Die Icons haben aber Positive werte > max 100.


Delphi-Quellcode:
constructor TNegativeArray.Create(aLenght: Integer);
var
  i: Integer;
begin

  MaxValue := IIF(aLenght > 6, aLenght, 0); //Eigentlich quatsch da die Classe nur Negative werte unterstützt 7 wäre in dem Fall dann -7 und nicht 1 wie benötigt.
  SetLength(FData, aLenght);
  for i := 0 to aLenght do
    FData[i] := TSprite.create;
end;
Aber trotzdem wird set und getData entfernt.
Siehe Pic.


gruss

jaenicke 1. Mai 2017 16:16

AW: die aufzurufende funktion wurde vom linker entfernt
 
Wo wird denn GetData verwendet? Ich sehe nur die Verwendung von FData.

Wenn du die Property published machst, wird sie auch immer einkompiliert.

bepe 1. Mai 2017 16:20

AW: die aufzurufende funktion wurde vom linker entfernt
 
Dein Problem ist das der Index nicht stimmt und somit dein Assertion auslöst. Deine Methoden werden also nicht vom Linker entfernt. Aber du hast keine blauen Punkte weil die Methoden als Inline markiert sind.

Wäre jetzt meine wilde Vermutung, basierend auf dem Screenshot....

EWeiss 1. Mai 2017 16:20

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von jaenicke (Beitrag 1369635)
Wo wird denn GetData verwendet? Ich sehe nur die Verwendung von FData.

Wenn du die Property published machst, wird sie auch immer einkompiliert.

Das geht nicht.

Zitat:

[DCC Warnung] uSprite.pas(92): W1055 PUBLISHED verursachte, dass RTTI ($M+) zu Typ 'TNegativeArray' hinzugefügt wurde
[DCC Fehler] uSprite.pas(93): E2188 Published-Eigenschaft 'Data' kann nicht vom Typ ARRAY sein

gruss

EWeiss 1. Mai 2017 16:22

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Deine Methoden werden also nicht vom Linker entfernt
Doch!
Das wird mir angezeigt wenn ich mit der Maus über
Delphi-Quellcode:
gS[0].Bitmap :=
dem Bitmap gehe.

gruss

bepe 1. Mai 2017 16:26

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von EWeiss (Beitrag 1369640)
Zitat:

Deine Methoden werden also nicht vom Linker entfernt
Doch!
Das wird mir angezeigt wenn ich mit der Maus über
Delphi-Quellcode:
gS[0].Bitmap :=
dem Bitmap gehe.

gruss

Das hat nix zu sagen (vermutlich wegen dem Inline). Aber wenn dein Screenshot keine "Fälschung" ist, dann wurde Zeile 291 ausgeführt. Und die befindet sich in einer der vermeintlich entfernten Methoden.

EWeiss 1. Mai 2017 16:31

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von bepe (Beitrag 1369642)
Zitat:

Zitat von EWeiss (Beitrag 1369640)
Zitat:

Deine Methoden werden also nicht vom Linker entfernt
Doch!
Das wird mir angezeigt wenn ich mit der Maus über
Delphi-Quellcode:
gS[0].Bitmap :=
dem Bitmap gehe.

gruss

Das hat nix zu sagen (vermutlich wegen dem Inline). Aber wenn dein Screenshot keine "Fälschung" ist, dann wurde Zeile 291 ausgeführt. Und die befindet sich in einer der vermeintlich entfernten Methoden.

Ich habe das Inline entfernt trotzdem bekomme ich gleiche Fehlermeldung.
Assertion failed.

getData ist jetzt aktiviert ändert aber nichts.
Ich glaube es ist besser den Code komplett umzuschreiben und die Classe in die Tonne werf ;) wenn ich keine praktikable Lösung finde.

gruss

himitsu 1. Mai 2017 16:34

AW: die aufzurufende funktion wurde vom linker entfernt
 
Inline ... da gibt es eben nicht DIE eine Methode, sondern viele Kopieen davon, innerhalb der aufrufenden Codestellen.

[edit]
erst hängt das Netz und sind Viele hier voll gemein und antworten einfach so zwischendurch. :cry:

Olli73 1. Mai 2017 16:35

AW: die aufzurufende funktion wurde vom linker entfernt
 
Setze jetzt mal einen Haltepunkt auf assert(..) und schaue ob dort ein positiver Index kommt.

bepe 1. Mai 2017 16:39

AW: die aufzurufende funktion wurde vom linker entfernt
 
Das Inline ist nicht schuld. Es ist das Assert. Da kommt vermutlich ein positiver Wert rein. Aber mit deinem Assert stellst du sicher, das nur negative Werte und Null akzeptiert werden.

Da du da eh noch ein Abs hast, sind die Asserts falsch und überflüssig ;)

EWeiss 1. Mai 2017 16:39

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von Olli73 (Beitrag 1369648)
Setze jetzt mal einen Haltepunkt auf assert(..) und schaue ob dort ein positiver Index kommt.

Nein ich sagte schon es kracht direkt.

Mit Inline kann ich eh keinen Haltepunkt setzen.
Ohne Inline kann ich Haltepunkte bei getData setzen. (Aber es kracht bei Assertion.
setData hingegen ist immer noch ausgeschlossen kann keinen Haltepunkt setzen.

gruss

EWeiss 1. Mai 2017 16:44

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von bepe (Beitrag 1369650)
Da du da eh noch ein Abs hast, sind die Asserts falsch und überflüssig ;)

Habe diese deaktiviert läuft jetzt durch.
Obwohl der Kram immer noch entfernt wird.
Ich werde die Classe verwerfen das macht keinen sinn.

Für mein anderes Problem mache ich einen neuen Thread auf.
Danke.

Zitat:

erst hängt das Netz und sind Viele hier voll gemein und antworten einfach so zwischendurch.
So ein Ärger aber auch! :)

gruss

hanvas 1. Mai 2017 19:06

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von bepe (Beitrag 1369650)
Da du da eh noch ein Abs hast, sind die Asserts falsch und überflüssig ;)

Sind Sie nicht. Die ursprüngliche Frage (in einem anderen Thread) war die Verwendung ausschließlich negativer Indicies für das Array, zu nichts anderem ist die Klasse gut. Positive Indizies werden nicht unterstützt.

In der Zwischenzeit sollen wohl auch Indizies > 0 verwendet werden. Ohne Translation der Indizies adressieren die Positionen -X und X die gleiche Zelle im Array, es sollen aber - soweit ich verstehe was er will - unterschiedliche Daten an -X und X gespeichert werden. Durch das Assert wäre ihm das wenigstens aufgefallen, ohne Assert ist der Fehler später viel schwerer zu erkennen.

cu Ha-Jö

EWeiss 1. Mai 2017 19:27

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von hanvas (Beitrag 1369668)
Zitat:

Zitat von bepe (Beitrag 1369650)
Da du da eh noch ein Abs hast, sind die Asserts falsch und überflüssig ;)

Positive Indizies werden nicht unterstützt.

cu Ha-Jö

Ja und das ist mein Problem daher muss ich trotz deiner guten Arbeit die Classe verwerfen.

Zum besseren Verständnis.
Hier werden die Bitmap Ressourcen addiert die für das Window später verwendet werden.
Die Values gehen von -5 > 0

Delphi-Quellcode:
procedure AddChildControls();
begin

  gs := TNegativeArray.Create(6); // -5 to 0

  gS[0].Bitmap := SKAERO_CreateBitmapFromFile(FolderResource + 'UseBack.png', width, height);
  gS[0].w := width;
  gS[0].h := height;
  gS[0].x := 0;
  gS[0].y := MAX(YMIN_SIZE - gS[0].h, 0);
  gS[0].opacity := 255;

  gS[ID_LEFT].x := 0;
  gS[ID_LEFT].y := YMIN_SIZE - 25;
  gS[ID_LEFT].opacity := 128;
  gS[ID_LEFT].Bitmap := SKAERO_CreateBitmapFromFile(FolderResource + 'Left.png', width, height);
  gS[ID_LEFT].w := width;
  gS[ID_LEFT].h := height;

  gS[ID_RIGHT].x := gS[0].w - gS[ID_LEFT].w;
  gS[ID_RIGHT].y := YMIN_SIZE - 25;
  gS[ID_RIGHT].opacity := 128;
  gS[ID_RIGHT].Bitmap := SKAERO_CreateBitmapFromFile(FolderResource + 'Right.png', width, height);
  gS[ID_RIGHT].w := width;
  gS[ID_RIGHT].h := height;

  gS[ID_FLARE].x := 0;
  gS[ID_FLARE].y := 16;
  gS[ID_FLARE].opacity := 200;
  gS[ID_FLARE].Bitmap := SKAERO_CreateBitmapFromFile(FolderResource + 'Flare.png', width, height);
  gS[ID_FLARE].w := width;
  gS[ID_FLARE].h := height;

  gS[ID_BLUEFLARE].Bitmap := SKAERO_CreateBitmapFromFile(FolderResource + 'BlueFlare.png', width, height);
  gS[ID_BLUEFLARE].w := width;
  gS[ID_BLUEFLARE].h := height;
  gS[ID_BLUEFLARE].x := 0;
  gS[ID_BLUEFLARE].y := YMIN_SIZE - (gS[ID_BLUEFLARE].h + 3);
  gS[ID_BLUEFLARE].opacity := 255;

  gS[ID_FOCUS].Bitmap := SKAERO_CreateBitmapFromFile(FolderResource + 'Focus.png', width, height);
  gS[ID_FOCUS].w := width;
  gS[ID_FOCUS].h := height;
  gS[ID_FOCUS].x := 0;
  gS[ID_FOCUS].y := YMIN_SIZE - (gS[ID_FOCUS].h + 4);
  gS[ID_FOCUS].opacity := 128;

end;
Das Problem mit dieser Classe ist das ich NUR Negative Values addieren kann.
Bsp.
Icons werden addiert.

Delphi-Quellcode:
    if CreateBarIcon(sIconSearch, nFound) then
    begin
      inc(nCount);
      //Setlength(gS, nCount); funktioniert nicht mher wegen der neuen Classe

      gS[nCount].y := nHeight;
      gS[nCount].SCALE := SCALE_DEFAULT;
      gS[nCount].opacity := 255;
      sUseThumb := sTempPath + 'OTTB ' + IntToStr(nFound) + '.png';
      gS[nCount].Bitmap := CreateDockIcon(sUseThumb, gS[nCount].w, gS[nCount].h);

      DeleteFile(sUseThumb);

      if DoLnk then
        gS[nCount].ShellTo := Lowercase(sTarget);
Hier wird das Array normalerweise redimensioniert.
Wenn gS positive werte bekommt sind sie am ende doch Negativ bedingt durch die Classe.

Das Array gS muss eine Kombination von Negativen und Positiven werten sein.
Da das aber nicht geht werde ich wohl oder übel wieder alles umbauen müssen.

gruss

Olli73 1. Mai 2017 22:07

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von EWeiss (Beitrag 1369673)
Das Problem mit dieser Classe ist das ich NUR Negative Values addieren kann.

...

Hier wird das Array normalerweise redimensioniert.
Wenn gS positive werte bekommt sind sie am ende doch Negativ bedingt durch die Classe.

Das Array gS muss eine Kombination von Negativen und Positiven werten sein.
Da das aber nicht geht werde ich wohl oder übel wieder alles umbauen müssen.

Wer sagt, dass das nicht geht? Anstatt

Delphi-Quellcode:
function TNegativeArray.getData(index: Integer): TSprite;
begin
  assert(index <= 0);
  result := fData[abs(index)];
end;
einfach z.B: das hier nehmen:

Delphi-Quellcode:
function TNegativeArray.getData(index: Integer): TSprite;
begin
  if Index < 0 then
    result := fData[abs(index + 1) * 2 + 1]
  else
    result := fData[index*2];
end;
Edit: Quelltext angepasst, siehe unten.

EWeiss 1. Mai 2017 22:21

AW: die aufzurufende funktion wurde vom linker entfernt
 
Delphi-Quellcode:
function TNegativeArray.getData(index: Integer): TSprite;
begin
  if Index < 0 then
     result := fData[abs(index + 1) * 2 + 1]
   else
   result := fData[index * 2];

  fData[abs(index)]; //[DCC Fehler] uSprite.pas(297): E2014 Anweisung erforderlich, aber Ausdruck vom Typ 'TSprite' gefunden
end;
Zusätzlich habe ich immer noch das Problem bei der Redimensionierung.

Delphi-Quellcode:
    if CreateBarIcon(sIconSearch, nFound) then
    begin
      inc(nCount);
      //Setlength(gS, nCount);
Irgendwie ein Anfang ohne Ende ;)

Denke mal
Zitat:

fData[abs(index)];
wird nicht mehr benötigt.


gruss

Olli73 1. Mai 2017 22:52

AW: die aufzurufende funktion wurde vom linker entfernt
 
Genau.
Delphi-Quellcode:
fData[abs(index)];
muss weg. Das stand da noch von vorher. Copy&Paste halt.

Für deine Dimensionierung (SetLength) machst du einfach eine Methode in die Klasse, die dies vornimmt;

Wenn dein TNegativeArray von -n..+n geht, musst du SetLength mit n*2+1 aufrufen;

EWeiss 1. Mai 2017 22:55

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von Olli73 (Beitrag 1369700)
Genau.
Delphi-Quellcode:
fData[abs(index)];
muss weg. Das stand da noch von vorher. Copy&Paste halt.

Für deine Dimensionierung (SetLength) machst du einfach eine Methode in die Klasse, die dies vornimmt;

Wenn dein TNegativeArray von -n..+n geht, musst du SetLength mit n*2+1 aufrufen;

Kleines Beispiel muss sonst raten ;)
Danke.. wenn es funktioniert kann ich die vielleicht doch noch verwenden.

gruss

Olli73 1. Mai 2017 23:15

AW: die aufzurufende funktion wurde vom linker entfernt
 
Delphi-Quellcode:

  TNegativeArray = class(TObject)
    ...
  public
    ...
    procedure SetLen(n: Integer);

    property Data[index: Integer]: TSprite read getData write setData; default;
    property MaxValue: Integer read GetMaxValue write SetMaxValue;
  end;

procedure TNegativeArray.SetLen(n: Integer);
begin
  SetLength(fData, n*2+1);
end;
Dann kannst du dein Array mit
Delphi-Quellcode:
gs.SetLen(n) dimensionieren.

EWeiss 1. Mai 2017 23:23

AW: die aufzurufende funktion wurde vom linker entfernt
 
Danke werde es gleich mal testen. ;)

gruss

EWeiss 1. Mai 2017 23:39

AW: die aufzurufende funktion wurde vom linker entfernt
 
Hmmm...
Bei

Delphi-Quellcode:
gS[ID_BLUEFLARE].Bitmap :=
also Index -4 kracht es beim einlesen der Bitmap. :wall:
Delphi-Quellcode:
procedure TSprite.SetBitmap(const Value: HBitmap);
begin

  FBitmap := Value;
end;
Es sind alle Arrays mit TSprite.Create zugewiesen.
Das HBitmap handle was übergeben werden soll ist auch korrekt.
getData ist wieder nicht zugewiesen.

gruss

Olli73 1. Mai 2017 23:46

AW: die aufzurufende funktion wurde vom linker entfernt
 
Was gibst du denn beim Create für einen Wert für aLength an?

EWeiss 1. Mai 2017 23:49

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von Olli73 (Beitrag 1369707)
Was gibst du denn beim Create für einen Wert für aLength an?

Delphi-Quellcode:
constructor TNegativeArray.Create(aLenght: Integer);
var
  i: Integer;
begin

  MaxValue := IIF(aLenght > 6, aLenght, 0);
  SetLength(FData, aLenght);

  for I := 0 to aLenght do
    FData[i] := TSprite.Create;
end;
Delphi-Quellcode:
gs := TNegativeArray.Create(6);


gruss

Olli73 1. Mai 2017 23:50

AW: die aufzurufende funktion wurde vom linker entfernt
 
6 ist auch zu wenig => n*2+1
Da du scheinbar mit 5 anfängst also 11.

EWeiss 1. Mai 2017 23:53

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von Olli73 (Beitrag 1369710)
6 ist auch zu wenig => n*2+1
Da du scheinbar mit 5 anfängst also 11.

Dann habe ich aber 11 Arrays wo von nur 5 verwendet werden.. Hmmm
-5 > 0 = 6 Einträge

gruss

Olli73 1. Mai 2017 23:53

AW: die aufzurufende funktion wurde vom linker entfernt
 
oder so:
Delphi-Quellcode:
constructor TNegativeArray.Create(aLenght: Integer);
var
  i: Integer;
begin

  MaxValue := IIF(aLenght > 6, aLenght, 0);

  SetLength(FData, aLenght*2+1);

  for I := 0 to (aLenght*2) do
    FData[i] := TSprite.Create;
end;

Olli73 1. Mai 2017 23:54

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von EWeiss (Beitrag 1369711)
Dann habe ich aber 11 Arrays wo von nur 5 verwendet werden.. Hmmm
-5 > 0 = 6 Einträge

Das Array läuft immer von -n bis +n, also von -5 bis +5

Olli73 1. Mai 2017 23:56

AW: die aufzurufende funktion wurde vom linker entfernt
 
Oder gehen deine negativen Zahlen immer nur bis -5 runter, d.h. -6, -7 etc. gibt es nie?

EWeiss 1. Mai 2017 23:59

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von Olli73 (Beitrag 1369713)
Zitat:

Zitat von EWeiss (Beitrag 1369711)
Dann habe ich aber 11 Arrays wo von nur 5 verwendet werden.. Hmmm
-5 > 0 = 6 Einträge

Das Array läuft immer von -n bis +n, also von -5 bis +5

Das geht nicht.. sorry.
Wenn ich auf UBOUND also High(gs) hin prüfe dann muss das Array genau stimmen.
Ich kann keine Eigenschaften an einem nicht verwendeten Array Eintrag vergeben.

Scheint doch irgendwie nicht richtig zu laufen.
Bedenke Theoretisch könnte ich zusätzliche 100 Icons zum Array addieren wenn sie auf dem Desktop liegen.

gruss

EWeiss 2. Mai 2017 00:01

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Oder gehen deine negativen Zahlen immer nur bis -5 runter, d.h. -6, -7 etc. gibt es nie?
Es gibt nur soviel Array Einträge von minus bis 0 wie Bitmaps zur Laufzeit zugewiesen werden.
Das sind bei dieser Anwendung ganze 6 Stück.

Also nein es geht niemals unter -5 und 0 ist der höchste Eintrag.. für die Bitmaps.
Dazu kommen dann natürlich im positiven Bereich die Icons.
Deshalb muss ich ja dann das Array Redimensionieren ohne das die Einträge -5 > 0 verloren gehen.

Verstehe das nicht das man in Delphi keine minus werte einem Array hinzufügen kann. :wall::kotz:

gruss

Olli73 2. Mai 2017 00:05

AW: die aufzurufende funktion wurde vom linker entfernt
 
Dann kommt natürlich sowas in Frage:

Delphi-Quellcode:
function TNegativeArray.getData(index: Integer): TSprite;
begin
  result := fData[index + 5]
end;

Olli73 2. Mai 2017 00:08

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von EWeiss (Beitrag 1369717)
Verstehe das nicht das man in Delphi keine minus werte einem Array hinzufügen kann. :wall::kotz:

Das gilt nur für dynamische Arrays.

EWeiss 2. Mai 2017 00:14

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von Olli73 (Beitrag 1369718)
Dann kommt natürlich sowas in Frage:

Delphi-Quellcode:
function TNegativeArray.getData(index: Integer): TSprite;
begin
  result := fData[index + 5]
end;

Danke für deine Mühe aber es funktioniert so nicht.
Die minus werte bis 0 ja aber der Rest beim neu Dimensionieren nicht.
Mir gehen die Daten von -5 > 0 verloren.

Na ja ein Versuch war es wert.
Eventuell muss ich dafür ein neues, eigenes Array definieren welches nur die Icons verwaltet.
Der sinn des ganzen ist das ich nur ein Array verwende mit dem ich alle Daten vergleichen und bearbeiten kann.
Also minus für die Bitmaps und Plus für den Rest.


gruss

Olli73 2. Mai 2017 00:18

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von EWeiss (Beitrag 1369721)
Danke für deine Mühe aber es funktioniert so nicht.
Die minus werte bis 0 ja aber der Rest beim neu Dimensionieren nicht.
Mir gehen die Daten von -5 > 0 verloren.

Theoretisch müsste es so funktionieren. Dann hast du irgendwo noch einen Fehler drin....


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