Delphi-PRAXiS
Seite 2 von 2     12   

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 2. Mai 2017 00:25

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von Olli73 (Beitrag 1369722)
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....

Nein kein Fehler.
Nochmal ;)

Delphi-Quellcode:
    if CreateBarIcon(sIconSearch, nFound) then
    begin
      inc(nCount);
      gS.SetLen(nCount);

      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);
Wenn ein Icon gefunden wird ist CreateBarIcon true.
Danach wird nCount inkrementiert und die neue länge vom Array festgelegt.
nCount ist in diesen Fall 1 also > 0 trotzdem werden die anderen Arrays die drunter liegen gelöscht.

Ist auch logisch denn der Index eines Arrays fängt bei 0 an nicht bei -5 diese sind nur Virtuell.

gruss

Olli73 2. Mai 2017 00:30

AW: die aufzurufende funktion wurde vom linker entfernt
 
Wie sieht denn jetzt dein Funktion gS.SetLen() aus?

EWeiss 2. Mai 2017 00:35

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von Olli73 (Beitrag 1369724)
Wie sieht denn jetzt dein Funktion gS.SetLen() aus?

Delphi-Quellcode:
  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;

    procedure SetLen(Len: Integer);
    property Data[Index: Integer]: TSprite read getData write setData; default;
    property MaxValue: Integer read GetMaxValue write SetMaxValue;
  end;
Delphi-Quellcode:
procedure TNegativeArray.SetLen(Len: Integer);
begin

  SetLength(fData, Len * 2 + 1);
end;
Scheint jetzt wohl falsch zu sein.

gruss

Olli73 2. Mai 2017 00:40

AW: die aufzurufende funktion wurde vom linker entfernt
 
Delphi-Quellcode:
procedure TNegativeArray.SetLen(Len: Integer);
begin
  SetLength(fData, Len + 5);

  // Hier müssen noch entsprechend Instanzen von TSprite erstellt werden
  // (nur für die, die neu hinzukommen)
end;

Olli73 2. Mai 2017 00:45

AW: die aufzurufende funktion wurde vom linker entfernt
 
sorry, muss +6 sein oben

EWeiss 2. Mai 2017 00:46

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von Olli73 (Beitrag 1369726)
Delphi-Quellcode:
procedure TNegativeArray.SetLen(Len: Integer);
begin
  SetLength(fData, Len + 5);

  // Hier müssen noch entsprechend Instanzen von TSprite erstellt werden
  // (nur für die, die neu hinzukommen)
end;

Ich glaube muss mal eine VCL App erstellen mit der ich die Arrays prüfen kann. ;)
Ob die Indizien stimmen.

gruss

EWeiss 2. Mai 2017 01:46

AW: die aufzurufende funktion wurde vom linker entfernt
 
Eine ganz einfache Anwendung.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, uSprite;

type
  TForm1 = class(TForm)
    MemoN: TMemo;
    btnAnalyze: TButton;
    btnValid: TButton;
    MemoValid: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure btnAnalyzeClick(Sender: TObject);
    procedure btnValidClick(Sender: TObject);
  private
    gS: TNegativeArray;
    MaxCount: Integer;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnAnalyzeClick(Sender: TObject);
var
  Count: Integer;
  rnd: Integer;
begin
  Count := 0;
  rnd := Random(100);

  repeat
    inc(Count);
    gS.SetLen(Count);

    gS[Count].x := Count;
    MemoN.Lines.Add(IntToStr(gS[Count].x));
  until Count = rnd;
end;

procedure TForm1.btnValidClick(Sender: TObject);
var
  i: Integer;
begin
  MemoValid.Clear;

  for i := 0 to MemoN.Lines.Count do
  if Assigned(gS[i]) then
    MemoValid.Lines.Add('True ' + IntToStr(gS[i].x));

end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin

  gS := TNegativeArray.Create(6);
  for i := -5 to 0 do
  begin
    gS[i] := TSprite.Create;
    gS[i].x := i;
    MemoN.Lines.Add(IntToStr(gS[i].x) + ' Count ' + IntToStr(MemoN.Lines.Count));
    MaxCount := i;
  end;

end;

end.
Ich muss jetzt mindestens 100 bzw. Random(100) Einträge addieren können ohne das die negativen Arrays zerstört werden.
Aber!
Beim zweiten Positiven Eintrag kracht es schon.
wie gehabt setData und getData werden vom Linker entfernt.
Sorry ich bekomme das mit dieser Classe nicht geregelt. (Vielleicht hat ja noch irgend jemand eine Idee.)

Wie man am Bild schon erkennen kann sind die ersten 4 Arrays Assigned aber alle Values von X falsch.
Und ich habe noch keine Positive Arrays addiert.

gruss

hoika 2. Mai 2017 04:34

AW: die aufzurufende funktion wurde vom linker entfernt
 
Hallo,
ich verstehe diese ganze negativ-Nummer einfach nicht.
Warum nimmst du statt das -5 bis 0 nicht einfach 0 bis 5 und
1. passt den Setter und Getter entsprechend an
Oder
2. übergibst als Parameter immer -X statt X
Oder
3. benutzt ein statisches Array -5 bis 0

Olli73 2. Mai 2017 09:22

AW: die aufzurufende funktion wurde vom linker entfernt
 
Liste der Anhänge anzeigen (Anzahl: 1)
So funktioniert es:
Anhang 47237

Edit: Und wenn du bei der Deklaration von getData und setData das "inline" rausnimmst, kannst du die Methoden auch debuggen.

EWeiss 2. Mai 2017 12:31

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

ich verstehe diese ganze negativ-Nummer einfach nicht.
Was ist da nicht zu verstehen. ?

Ich möchte NUR ein globales Array verwenden deshalb muss ich dieses selber in sich teilen.
Das geht nur in dem ich für den einen teil negative Bereiche verwende und den anderen Positive.
Jo könnte auch ein mehrdimensionales Array verwenden das verkompliziert die ganze Sache aber noch zusätzlich.

@Oli73
Danke für deine Hilfe werde es mal testen.

gruss

sko1 2. Mai 2017 13:25

AW: die aufzurufende funktion wurde vom linker entfernt
 
Ich lesen den Thread schon eine Weile mit, aber wenn Du schon massive Probleme mit Deinem negativen Index hast, warum stellst Du Dich mit

Zitat:

Ich möchte NUR ein globales Array verwenden deshalb muss ich dieses selber in sich teilen.
dann so stur?
Mehrere einzelne Arrays für die verschiedenen Inhalte sind doch wesentlich einfacher handelbar!?

Ciao
Stefan

Olli73 2. Mai 2017 13:43

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von sko1 (Beitrag 1369809)
Ich lesen den Thread schon eine Weile mit, aber wenn Du schon massive Probleme mit Deinem negativen Index hast, warum stellst Du Dich mit

Zitat:

Ich möchte NUR ein globales Array verwenden deshalb muss ich dieses selber in sich teilen.
dann so stur?
Mehrere einzelne Arrays für die verschiedenen Inhalte sind doch wesentlich einfacher handelbar!?

Ciao
Stefan

Nachdem ich seinen Code bearbeitet habe, läuft es ja auch so. Natürlich hätte man auch 2 Arrays in der Klasse verstecken können, dann wäre es von außen immer noch 1 "Array".

EWeiss 2. Mai 2017 13:47

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

dann so stur?
Mehrere einzelne Arrays für die verschiedenen Inhalte sind doch wesentlich einfacher handelbar!?
Weil es Menschen gibt die nicht so schnell aufgeben wenn es eine fast unlösbare Aufgabe gibt.

Dafür haben wir das Forum damit man voneinander Lernen kann.
Und mit Unterstützung von @Olli73 geht es ja nun auch.

Der alte Spruch "Es führen viele Wege nach Rom" oder war es Köln? bei den Galliern

Zitat:

Natürlich hätte man auch 2 Arrays in der Klasse verstecken können, dann wäre es von außen immer noch 1 "Array".
War aber nicht erwünscht.

gruss

himitsu 2. Mai 2017 13:50

AW: die aufzurufende funktion wurde vom linker entfernt
 
Delphi-Quellcode:
function TNegativeArray.getData(index: Integer): TSprite;
begin
  result := fData[index + offset];
offset=100 für bis zu -100 bis +x


:gruebel:
Bezüglich dem abs(index)*2+1 und so.

Olli73 2. Mai 2017 13:57

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von himitsu (Beitrag 1369822)
Delphi-Quellcode:
function TNegativeArray.getData(index: Integer): TSprite;
begin
  result := fData[index + offset];
offset=100 für bis zu -100 bis +x


:gruebel:
Bezüglich dem abs(index)*2+1 und so.

Davon (abs(index)*2+1) sind wir schon lange weg. Und Offset ist bei ihm fix/immer 5.

EWeiss 2. Mai 2017 14:19

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von Olli73 (Beitrag 1369772)
So funktioniert es:
Anhang 47237

Edit: Und wenn du bei der Deklaration von getData und setData das "inline" rausnimmst, kannst du die Methoden auch debuggen.

Sorry Olli hatte jetzt erst die Möglichkeit es zu testen.
Wenn es das richtig Archiv ist das du hochgeladen hast dann funktioniert es immer noch nicht :cry:

sobald ich auf den Check Valid Button klicke kracht es.

gruss

Olli73 2. Mai 2017 14:31

AW: die aufzurufende funktion wurde vom linker entfernt
 
Liste der Anhänge anzeigen (Anzahl: 1)
War wohl die alte Version. Hier das aktuelle:

EWeiss 2. Mai 2017 14:43

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von Olli73 (Beitrag 1369840)
War wohl die alte Version. Hier das aktuelle:

Perfekt ;) :thumb:
Danke noch mal.

gruss

EWeiss 2. Mai 2017 15:15

AW: die aufzurufende funktion wurde vom linker entfernt
 
Habe es noch etwas abgeändert damit die Classe flexibel bleibt.

snipp im nächsten Beitrag.

gruss

Ghostwalker 2. Mai 2017 15:16

AW: die aufzurufende funktion wurde vom linker entfernt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal meine korregierte Variante mit Kommentaren :)

Schaus dir einfach mal an.

Kleiner Tip am Rande: In einer Debug-Konfiguration immer die Compileroptimierung abschalten :)

EWeiss 2. Mai 2017 15:17

AW: die aufzurufende funktion wurde vom linker entfernt
 
Zitat:

Zitat von Ghostwalker (Beitrag 1369864)
Hier mal meine korregierte Variante mit Kommentaren :)

Schaus dir einfach mal an.

Kleiner Tip am Rande: In einer Debug-Konfiguration immer die Compileroptimierung abschalten :)

Auf jeden Fall werde ich mir Anschauen..
Danke.

gruss

EWeiss 2. Mai 2017 15:38

AW: die aufzurufende funktion wurde vom linker entfernt
 
Noch ein paar kleine Änderungen damit die Classe flexibel bleibt.

Rückgabe NIL addiert falls was schief läuft.

Delphi-Quellcode:
function TNegativeArray.getData(index: Integer): TSprite;
var
 idx : Integer;
begin
  result := nil;

  if ((index <= 0) or ((index > 0) and (Length(Fdata) > FMaxDefault ))) then
  begin
    idx := self.MappIndex(index);
    result := fdata[idx];
  end;
end;
create verändert keine festen werte mehr zuweisen.

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

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

  for I := 0 to aLenght do
    FData[i] := TSprite.Create;
end;
Der Rest im Anhang.

gruss

EWeiss 2. Mai 2017 16:58

AW: die aufzurufende funktion wurde vom linker entfernt
 
Noch eine Änderung.

Delphi-Quellcode:
procedure TNegativeArray.SetLen(Len: Integer);
var
  oldidx,i : Integer;

begin
  if ((Len + FMaxDefault) > Length(Fdata)) then
  begin
    //alte Länge = 1. neuer Index nach der vergrößerung
    oldidx := Length(Fdata);
    //Neue Länge (len = 1 entspricht neue größe 7 elemente also -5 bis 1
    SetLength(fData, Len + FMaxDefault);

    for i := oldidx to Length(Fdata)-1 do
    begin
      fdata[i] := TSprite.Create;
      MaxValue := IIF(i > (FMaxDefault - 1), (i - (FMaxDefault - 1)), 0);
    end;
  end;
end;
MaxValue muss hier aktualisiert werden.
Das ist deshalb wichtig weil alle Bitmaps > 0 (Icons) vorher gelöscht werden müssen.

Delphi-Quellcode:
  if gS.MaxValue > 0 then
  begin
    for K := 1 to gS.MaxValue do
    begin
      if gS[K].Bitmap <> 0 then
      begin
        DeleteObject(gS[K].Bitmap);
        gS[K].Bitmap := 0;
      end;
    end;
  end;
gruss


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

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