Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Array und negativ werte. (https://www.delphipraxis.net/192551-array-und-negativ-werte.html)

EWeiss 30. Apr 2017 15:12


Array und negativ werte.
 
Ich möchte ein Array mit negativ werten anlegen.
bsp.

Delphi-Quellcode:
const
 a = -1;
 b = -2;
 c = -3;
 d = -4;
 e = -5;

type
  Sprite = record
    x: Integer;
    y: Integer;
    w: Integer;
    h: Integer;
    visible: Bool;
  end;
  TSprite = Sprite;
  PSprite = ^TSprite;

var
  sp: Array of TSprite
Delphi-Quellcode:
  if sp[1].x < 40 then
    sp[a].visible := true
Delphi-Quellcode:
//sp[a].visible.. Array < 0 gleicht [DCC Fehler] Konstantenausdruck verletzt untere Grenzen.


logisch aber wie kann ich das trotzdem verwirklichen?

gruss

a.def 30. Apr 2017 15:20

AW: Array und negativ werte.
 
Super dumme Idee aber...

Delphi-Quellcode:
sp[(a*-1) - 1].visible := true
? :lol:

EWeiss 30. Apr 2017 15:24

AW: Array und negativ werte.
 
Zitat:

Zitat von a.def (Beitrag 1369494)
Super dumme Idee aber...

Delphi-Quellcode:
sp[(a*-1) - 1].visible := true
? :lol:

Was hat das mit dumm zu tun?
Ich möchte das meine HÖCHSTEN werte 0 betragen.. Was ist da also Dumm dran?
Es hat seine Berechtigung im weiteren Verlauf meines Codes.

Du willst werte die Fest zugewiesen wurden (CONST) mit a*-1 verändern? LOL (dumme Idee)

gruss

a.def 30. Apr 2017 15:27

AW: Array und negativ werte.
 
Zitat:

Was ist da also Dumm dran?
MEINE Idee mit dem *-1-1 meine ich ist eventuell dumm. Nicht dein Vorhaben.

Zitat:

Du willst werte die Fest zugewiesen wurden (CONST) mit a*-1 verändern? LOL (dumme Idee)
Der Wert der Konstanten wird nicht verändert.

EWeiss 30. Apr 2017 15:40

AW: Array und negativ werte.
 
Zitat:

MEINE Idee mit dem *-1-1 meine ich ist eventuell dumm. Nicht dein Vorhaben.
Entschuldige dann habe ich das falsch aufgefasst. ;)

Nur in dem Fall wenn ich das richtig verstehe könnte ich direkt die Const auf diese weise auslegen.
Delphi-Quellcode:
const
  a = 1;
  b = 2;
  c = 3;
  d = 4;
  e = 5;
Das Problem dabei ist nur sp[0] ist das in der ZOrder am höchsten angeordnete Bitmap.
Die anderen 4 müssen darunter liegen.

Anderes bsp:

Delphi-Quellcode:
const
  LBOUND = e // also -5

SetLength(sp, 1); // höchste Array Eintrag. "0"

for x := LBOUND to High(sp) do
begin
  if sp(x).hBitmap then
  begin
    DeleteObject(sp(x).hBitmap);
    sp[x].hBitmap := 0;
  end;
end;
oder..
Delphi-Quellcode:
for I := -1 downto LBOUND do


Eventuell geht das mit Delphi nicht.
Früher mit VB6 war das kein Problem. (Array mit - werten)

Sollte es nicht gehen muss ich mir mit der ZOrder etwas anderes überlegen.


gruss

Olli73 30. Apr 2017 15:48

AW: Array und negativ werte.
 
Was willst du eigentlich damit erreichen?

EWeiss 30. Apr 2017 15:50

AW: Array und negativ werte.
 
Zitat:

Zitat von Olli73 (Beitrag 1369498)
Was willst du eigentlich damit erreichen?

siehe editierten Beitrag.

gruss

Michael II 30. Apr 2017 15:57

AW: Array und negativ werte.
 
Du kannst doch das Problem mit den Indices "ausserhalb" der eckigen Klammern regeln.
Ich sehe hier keine Notwendigkeit negative Indices zu verwenden.

Und wenn du's doch tun willst und du bereits jetzt weisst, dass du nur Elemente von -5..-1 unterbringen willst oder zum Beispiel von -10..10, dann verwende doch einfach einen statischen Array:

sp : array[-10..10] of TSprite;

Dann kann der Compiler das für dich regeln :-D.

EWeiss 30. Apr 2017 16:01

AW: Array und negativ werte.
 
Zitat:

Zitat von Michael II (Beitrag 1369501)
Du kannst doch das Problem mit den Indices "ausserhalb" der eckigen Klammern regeln.
Ich sehe hier keine Notwendigkeit negative Indices zu verwenden.

Und wenn du's doch tun willst und du bereits jetzt weisst, dass du nur Elemente von -5..-1 unterbringen willst oder zum Beispiel von -10..10, dann verwende doch einfach einen statischen Array:

sp : array[-10..10] of TSprite;

Dann kann der Compiler das für dich regeln :-D.

Jep das wäre eine alternative.. ;)
Werde es mal testen.


Zurück das geht nicht.
-5 > 0 ist ein Array für die Bitmaps die ich zuweisen will.

sp[x] kann aber größer werden.. abhängig von den Icons die auf den Desktop liegen.
Werde wohl positive werte nehmen müssen.. Hmmm.

Danke gruss

Michael II 30. Apr 2017 16:19

AW: Array und negativ werte.
 
Nur so aus Neugierde... hast du mal Graphics32 verwendet? Oder schreibst du etwas für die fmx Welt?

EWeiss 30. Apr 2017 16:40

AW: Array und negativ werte.
 
Zitat:

Zitat von Michael II (Beitrag 1369504)
Nur so aus Neugierde... hast du mal Graphics32 verwendet? Oder schreibst du etwas für die fmx Welt?

Nein ;)
Ich schreibe eine Anwendung in der beim start
alle auf dem Desktop befindliche Verknüpfungen versteckt und dann zu einer Bar addiert werden.

Ich arbeite mit GDIPlus ohne Fremdkomponente.

gruss

hanvas 30. Apr 2017 18:03

AW: Array und negativ werte.
 
Zitat:

Zitat von EWeiss (Beitrag 1369493)
Ich möchte ein Array mit negativ werten anlegen.

Geht es Dir daraum das dass Array tatsächlich negative Indicies unterstützt - das geht nicht - oder nur um den Zugriff darauf?

Du könntest die Indicies entweder mit einer (inline) Funktion mappen oder das Array in eine Klasse / Record packen.

Also ungefähr so :

Delphi-Quellcode:

TYPE irgendwas = (Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag,Sonntag);

     TNegativeArray = class(TObject)
     private
      maxVal : Integer;
      fdata : array of irgendwas;

      function getData(index : Integer) : irgendwas; inline;
      procedure setData(index : Integer; aData : irgendwas); inline;
     public
      Constructor Create(aLenght : Integer);
      Destructor Destroy; override;
     property
       Data [ index : Integer ] : Irgendwas
         read getData write setData; default;
     end;

implementation

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

procedure TNegativeArray.setData(index : Integer; aData : irgendwas);
begin
 assert(index<=0);
 fData[abs(index] := aData;
end;
Vollkommen ungetestest. Zu verwenden wäre das dann so :

Delphi-Quellcode:

var a : TNegativeArray;

begin
 a    := TNegativeArray.Create(100); // Index läuft von -100 bis 0
 a[-1] := Montag;
end;

EWeiss 30. Apr 2017 18:11

AW: Array und negativ werte.
 
Zitat:

das geht nicht
ja in Delphi in VB6 schon so wie ich mich noch erinnern kann.

Danke. Die Idee ist nicht schlecht ;)
Aber!

Ich kann "a" nicht als TNegativeArray definieren..
Denn "a" ist schon als a: TSprite (Record) definiert. (wobei "a" nur ein Beispiel hier verwendet wird)

Sagen wir mal ich habe ein Bitmap das sich Links auf meiner Form befindet.
Der Index für dieses Bitmap ist mit
Delphi-Quellcode:
const
  ID_LEFT = -1;
  ID_RIGHT = -2;
definiert.

Dann lade ich das Bitmap auf diese weise.
Delphi-Quellcode:
  sp[ID_LEFT].x := 0;
  sp[ID_LEFT].y := YMIN_SIZE - 25;
  sp[ID_LEFT].opacity := 128;
  sp[ID_LEFT].Bitmap := SKAERO_CreateBitmapFromFile(FolderResource + 'Left.png',
    sp[ID_LEFT].w, sp[ID_LEFT].h);
Nun das würde in VB6 funktionieren aber nicht in Delphi.
Deshalb ist meine Denkweise dahingehend wohl falsch.
Das!
Delphi-Quellcode:
const
  ID_LEFT = 1;
  ID_RIGHT = 2;
stellt kein Problem dar.
Ja ich weis das ein Array in Delphi bei 0 anfängt. (Ich wollte es aber ändern)

gruss

hanvas 30. Apr 2017 19:00

AW: Array und negativ werte.
 
Zitat:

Zitat von EWeiss (Beitrag 1369512)
Danke. Die Idee ist nicht schlecht ;)
Aber!

Ich kann "a" nicht als TNegativeArray definieren..
Denn "a" ist schon als a: TSprite (Record) definiert.

Dann schreib halt irgendeinen anderen Bezeichner hin. Da du SP verwendest schreib halt

Delphi-Quellcode:

TYPE TSprite = record
      x: Integer;
      y: Integer;
      w: Integer;
      h: Integer;
      visible: Bool;
     end;

     TNegativeArray = class(TObject)
     private
      maxVal : Integer;
      fdata : array of TSprite;

      function getData(index : Integer) : TSprite; inline;
      procedure setData(index : Integer; aData : TSprite); inline;
     public
      Constructor Create(aLenght : Integer);
      Destructor Destroy; override;
     property
       Data [ index : Integer ] : Irgendwas
         read getData write setData; default;
     end;

implementation

Constructor TNegativeArray.Create(aLenght : Integer);
begin
 inherited;
 SetLength(fdata,aLength);
end;


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

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

Delphi-Quellcode:

const
  ID_LEFT = -1;
  ID_RIGHT = -2;

var sp : TNegativeArray; // Sprite Stack

begin
 sp := TNegativeArray.Create(3); // Hat Element -1, -2 _und_ 0
 sp[ID_LEFT].x := 0;
 ....
end.

cu Ha-Jö

EWeiss 30. Apr 2017 19:06

AW: Array und negativ werte.
 
Supi ja so könnte es gehen ;)
Danke für deine Mühe.

werde es mal testen.

gruss

EWeiss 30. Apr 2017 19:17

AW: Array und negativ werte.
 
Habe es mal eingebaut.

Delphi-Quellcode:
Data[index: Integer]: Variant read getData write setData; default;


Hoffe mal das Variant korrekt ist.

Allerdings bekomme ich Fehler

Create inherited entfernt.. [DCC Fehler] E2008 Inkompatible Typen
getData.. [DCC Fehler] E2008 Inkompatible Typen
setData.. [DCC Fehler] E2008 Inkompatible Typen

Hmm ja getData TSprite

sollte dann wohl so aussehen.
Delphi-Quellcode:
Data[index: Integer]: TSprite read getData write setData; default;

gruss

EWeiss 30. Apr 2017 19:39

AW: Array und negativ werte.
 
Irgendwie will es nicht so recht.

Delphi-Quellcode:
procedure MoveIcon(Offset: integer);
var
  K: integer;
begin
  for K := -1 downto LBOUND do
    sp[K].x := sp[K].x + Offset;

end;
Der linken Seite kann nichts zugewiesen werden.

wenn ich das property so auslege.
Delphi-Quellcode:
Data[index: Integer]: TSprite read getData write setData; default;


gruss

hanvas 30. Apr 2017 19:49

AW: Array und negativ werte.
 
Zitat:

Zitat von EWeiss (Beitrag 1369532)
Habe es mal eingebaut.

Delphi-Quellcode:
Data[index: Integer]: Variant read getData write setData; default;
Hoffe mal das Variant korrekt ist.

Nein ist es nicht. Das

Delphi-Quellcode:
 Data[Index : Integer] : Irgendwas
Stammte noch aus dem Beispiel davor. Korrekt wäre

Delphi-Quellcode:
 Data[Index : Integer] : TSprite read getData write setData; default;
getData und setData sind ja auch mit TSprite deklariert.

Jetzt musst Du schon selbst weitermachen, ich muss los.

cu Ha-Jö

hanvas 30. Apr 2017 19:55

AW: Array und negativ werte.
 
Zitat:

Zitat von EWeiss (Beitrag 1369534)
Irgendwie will es nicht so recht.

Delphi-Quellcode:
procedure MoveIcon(Offset: integer);
var
  K: integer;
begin
  for K := -1 downto LBOUND do
    sp[K].x := sp[K].x + Offset;

end;
Der linken Seite kann nichts zugewiesen werden.

wenn ich das property so auslege.
Delphi-Quellcode:
Data[index: Integer]: TSprite read getData write setData; default;
gruss

Mach aus TSprite eine Klasse anstelle eines Records dann gehts.

cu Ha-Jö

EWeiss 30. Apr 2017 20:00

AW: Array und negativ werte.
 
Zitat:

Nein ist es nicht. Das
Deshalb hatte ich es aus kommentiert da ich selbst darauf gekommen bin :)

Zitat:

Mach aus TSprite eine Klasse anstelle eines Records dann gehts.
Ok werde es testen ;)

gruss

EWeiss 1. Mai 2017 14:05

AW: Array und negativ werte.
 
Leider habe ich immer noch ein paar Probleme.

Ich habe die MaxValue definiert.
Delphi-Quellcode:
constructor TNegativeArray.Create(aLenght: Integer);
begin

  SetLength(fdata, aLenght);
  MaxValue := IIF(aLenght > 6, aLenght, 0);
end;
Die MaxValue überschreitet 0 nur dann wenn aLenght > 6 ist.
Also 0, -1, -2, -3, -4, -5 (MaxValue = 0) bei aLenght 7 = MaxValue = 1 usw..

Das zusätzliche Problem was ich noch habe wie soll ich die neue länge von Fdata zuweisen ohne das mein Sprite Array von -5 > 0 gelöscht wird.
Normal habe ich es vorher mit SetLength zugewiesen.

Wenn ich also ein Icon auf dem Desktop finde muss ich das Array erhöhen können.
Delphi-Quellcode:
    if CreateBarIcon(sIconSearch, nFound) then
    begin
      inc(nCount);
      Setlength(gS, nCount); // funktioniert nicht mehr.
Nochmal um das klar zu stellen ich verwende die Negativen werte ausschließlich für das Window
alles was darüber geht ist für die Icons zuständig.

Boahh...
Zitat:

TNegativeArray.getData wurde vom Linker entfernt.
Warum?


gruss


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