![]() |
AW: die aufzurufende funktion wurde vom linker entfernt
Zitat:
Nochmal ;)
Delphi-Quellcode:
Wenn ein Icon gefunden wird ist CreateBarIcon true.
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); 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 |
AW: die aufzurufende funktion wurde vom linker entfernt
Wie sieht denn jetzt dein Funktion gS.SetLen() aus?
|
AW: die aufzurufende funktion wurde vom linker entfernt
Zitat:
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:
Scheint jetzt wohl falsch zu sein.
procedure TNegativeArray.SetLen(Len: Integer);
begin SetLength(fData, Len * 2 + 1); end; gruss |
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; |
AW: die aufzurufende funktion wurde vom linker entfernt
sorry, muss +6 sein oben
|
AW: die aufzurufende funktion wurde vom linker entfernt
Zitat:
Ob die Indizien stimmen. gruss |
AW: die aufzurufende funktion wurde vom linker entfernt
Eine ganz einfache Anwendung.
Delphi-Quellcode:
Ich muss jetzt mindestens 100 bzw. Random(100) Einträge addieren können ohne das die negativen Arrays zerstört werden.
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. 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 |
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 |
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. |
AW: die aufzurufende funktion wurde vom linker entfernt
Zitat:
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 |
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:
Mehrere einzelne Arrays für die verschiedenen Inhalte sind doch wesentlich einfacher handelbar!? Ciao Stefan |
AW: die aufzurufende funktion wurde vom linker entfernt
Zitat:
|
AW: die aufzurufende funktion wurde vom linker entfernt
Zitat:
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:
gruss |
AW: die aufzurufende funktion wurde vom linker entfernt
Delphi-Quellcode:
offset=100 für bis zu -100 bis +x
function TNegativeArray.getData(index: Integer): TSprite;
begin result := fData[index + offset]; :gruebel: Bezüglich dem abs(index)*2+1 und so. |
AW: die aufzurufende funktion wurde vom linker entfernt
Zitat:
|
AW: die aufzurufende funktion wurde vom linker entfernt
Zitat:
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 |
AW: die aufzurufende funktion wurde vom linker entfernt
Liste der Anhänge anzeigen (Anzahl: 1)
War wohl die alte Version. Hier das aktuelle:
|
AW: die aufzurufende funktion wurde vom linker entfernt
Zitat:
Danke noch mal. gruss |
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 |
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 :) |
AW: die aufzurufende funktion wurde vom linker entfernt
Zitat:
Danke. gruss |
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:
create verändert keine festen werte mehr zuweisen.
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;
Delphi-Quellcode:
Der Rest im Anhang.
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; gruss |
AW: die aufzurufende funktion wurde vom linker entfernt
Noch eine Änderung.
Delphi-Quellcode:
MaxValue muss hier aktualisiert werden.
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; Das ist deshalb wichtig weil alle Bitmaps > 0 (Icons) vorher gelöscht werden müssen.
Delphi-Quellcode:
gruss
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz