AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array of TImage von anderer unit benutzen

Ein Thema von Andreas L. · begonnen am 8. Mai 2007 · letzter Beitrag vom 10. Mai 2007
Antwort Antwort
Andreas L.
(Gast)

n/a Beiträge
 
#1

Array of TImage von anderer unit benutzen

  Alt 8. Mai 2007, 18:44
Hi,
ich habe jetzt in meiner Klasse (siehe diesen Post:http://www.delphipraxis.net/internal...t.php?t=109480) den Constructor weiter ausgebaut. Ich möchte dort 7 Images in ein Array erstellen. Dieses Array soll dann von einer anderen Unit aus verwendet werden können um Bilder zu zuweisen die später von der ScrollBox benötigt werden. Ich bin an die Sache so rangegangen:
Delphi-Quellcode:

...
...

 type
  TElementList = class(TScrollBox)
   constructor Create(AOwner: TComponent); override;
   function Add(ElemType: TElementType; Content: String):Integer;
   procedure Refresh;
   procedure Move(OldPosition, NewPosition: Integer);
  end;

var
 Icons: Array of TImage; //hier wird der Array deklariert

...
...

constructor TElementList.Create(AOwner: TComponent);
begin

 inherited Create(AOwner);
 BevelInner := bvNone;
 BevelKind := bkFlat;
 BevelOuter := bvLowered;
 BorderStyle := bsNone;

 Items := TObjectList.Create;

 //hier erstelle ich die images, beim ersten bild bleibt der debugger stehen und es hagelt eine AV
 Icons[0] := TImage.Create(Self);
 Icons[1] := TImage.Create(Self);
 Icons[2] := TImage.Create(Self);
 Icons[3] := TImage.Create(Self);
 Icons[4] := TImage.Create(Self);
 Icons[5] := TImage.Create(Self);
 Icons[6] := TImage.Create(Self);

end;
Und so versuche ich Bilder in den Array zu packen:

Delphi-Quellcode:
 Icons[0].Picture := text.Picture;
 Icons[1].Picture := image.Picture;
 Icons[2].Picture := chart.Picture;
 Icons[3].Picture := table.Picture;
 Icons[4].Picture := syntax.Picture;
 Icons[5].Picture := html.Picture;
 Icons[6].Picture := media.Picture;
Welches Problem hat der Debugger hier?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Array of TImage von anderer unit benutzen

  Alt 8. Mai 2007, 19:14
Hallo Andreas,

bevor du die einzelnen Icons initialisieren kannst, musst du das Array dimensionieren:

Delphi-Quellcode:
begin
  // ...
  SetLength(Icons, 7);
  Icons[0] := TImage.Create(Self);
end;
Du hast das Array als globale Variable deklariert. Sollte es nicht besser eine Eigenschaft deiner Klasse sein?

Grüße vom marabu
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#3

Re: Array of TImage von anderer unit benutzen

  Alt 8. Mai 2007, 19:22
Hi,
danke für deine Antwort. Die Anwendung läuft jetzt. Die Bilder tauchen jedoch nicht auf wenn ich meine Add-Routine aufrufe. ich weiß jedoch nicht warum?!?!

Die Unit:
Delphi-Quellcode:
unit ElementList;

interface

 uses
  ExtCtrls, pngimage, graphics, SysUtils, Classes, forms, controls,
  contnrs;

 type
  TElementType = (etText, etImage, etChart, etTable, etCode, etHTML, etMedia);

 type
  TElementList = class(TScrollBox)
   constructor Create(AOwner: TComponent); override;
   function Add(ElemType: TElementType; Content: String):Integer;
   procedure Refresh;
   procedure Move(OldPosition, NewPosition: Integer);
  end;

var
 Icons: Array of TImage;

implementation

var
 Items: TObjectList;

constructor TElementList.Create(AOwner: TComponent);
begin

 inherited Create(AOwner);
 BevelInner := bvNone;
 BevelKind := bkFlat;
 BevelOuter := bvLowered;
 BorderStyle := bsNone;

 Items := TObjectList.Create;

 SetLength(Icons, 7);
 Icons[0] := TImage.Create(Self);
 Icons[1] := TImage.Create(Self);
 Icons[2] := TImage.Create(Self);
 Icons[3] := TImage.Create(Self);
 Icons[4] := TImage.Create(Self);
 Icons[5] := TImage.Create(Self);
 Icons[6] := TImage.Create(Self);

end;

procedure TElementList.Move(OldPosition, NewPosition: Integer);
begin

 Items.Move(OldPosition, NewPosition);
 Refresh;

end;

procedure TElementList.Refresh;
var
 i, position: Integer;
begin

 position := 0;

 for i := 0 to Items.count - 1 do
  begin

   (Items.Items[i] as TPanel).Visible := false;

  end;

 for i := 0 to Items.count - 1 do
  begin

   (Items.Items[i] as TPanel).Top := position + 80;
   (Items.Items[i] as TPanel).Visible := true;

  end;

end;

function TElementList.Add(ElemType: TElementType; Content: String):Integer;
var
 layer: TPanel;
 imgtype: TImage;
begin

 layer := TPanel.Create(Self);
 with layer do
  begin

   BevelInner := bvNone;
   BevelKind := bkNone;
   BevelOuter := bvNone;
   BorderStyle := bsNone;
   Align := alTop;
   Height := 80;
   Parent := Self;
   Visible := false;
   Color := clBlack;
   Result := Items.Add(layer);

  end;

 imgtype := TImage.Create(layer);
 with imgtype do
  begin

   Parent := layer;
   Visible := true;
   Left := 8;
   Top := 8;
   Height := 28;
   Width := 28;

  end;

 if ElemType = etText then
  begin

   imgtype.Picture.graphic := Icons[0].Picture.graphic;

  end
 else if ElemType = etImage then
  begin

   imgtype.Picture.graphic := Icons[1].Picture.graphic;

  end
 else if ElemType = etChart then
  begin

   imgtype.Picture.graphic := Icons[2].Picture.graphic;

  end
 else if ElemType = etTable then
  begin

   imgtype.Picture.graphic := Icons[3].Picture.graphic;

  end
 else if ElemType = etCode then
  begin

   imgtype.Picture.graphic := Icons[4].Picture.graphic;

  end
 else if ElemType = etHTML then
  begin

   imgtype.Picture.graphic := Icons[5].Picture.graphic;

  end
 else if ElemType = etMedia then
  begin

   imgtype.Picture.graphic := Icons[6].Picture.graphic;

  end;

end;

end.
Die Zuweisung der Bilderimg ButtonClick einer anderen Unit:
Delphi-Quellcode:
 Icons[0].Picture.graphic := text.Picture.graphic;
 Icons[1].Picture.graphic := image.Picture.graphic;
 Icons[2].Picture.graphic := chart.Picture.graphic;
 Icons[3].Picture.graphic := table.Picture.graphic;
 Icons[4].Picture.graphic := syntax.Picture.graphic;
 Icons[5].Picture.graphic := html.Picture.graphic;
 Icons[6].Picture.graphic := media.Picture.graphic;
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Array of TImage von anderer unit benutzen

  Alt 8. Mai 2007, 19:43
Weisst du schon, dass die Zuweisung der Bilder besser über die Methode Assign() erfolgen sollte?

Und hast du schon einmal darüber nachgedacht deiner Klasse eine Eigenschaft ImageList an Stelle von einem array of TImage zu spendieren?

Was die Visualisierung deiner Bilder angeht, da musst du den Fehler in dem Code suchen, der die Bilder sichtbar machen soll. Wo setzt du denn die Eigenschaft Parent deiner Bildkomponenten?

Freundliche Grüße
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#5

Re: Array of TImage von anderer unit benutzen

  Alt 8. Mai 2007, 20:03
Zitat von marabu:
Weisst du schon, dass die Zuweisung der Bilder besser über die Methode Assign() erfolgen sollte?
Nein, das wusste ich noch nicht. Versuche ich gleich umzubauen.

Zitat:
Und hast du schon einmal darüber nachgedacht deiner Klasse eine Eigenschaft ImageList an Stelle von einem array of TImage zu spendieren?
Ich verwende PNGs. Da die ImageList keine PNGs unterstützt müsste ich die TPNGimageList (http://andreas-lauss.de/archives/del...d-png-bildchen) verwenden. Jedoch ist die sehr buggy.

Zitat:
Was die Visualisierung deiner Bilder angeht, da musst du den Fehler in dem Code suchen, der die Bilder sichtbar machen soll. Wo setzt du denn die Eigenschaft Parent deiner Bildkomponenten?
Hier:
Delphi-Quellcode:
...
imgtype := TImage.Create(layer);
with imgtype do
  begin

   Parent := layer; //layer ist das TPanel
...
EDIT: Also der Parent passt so. Hab mal schnell in der selben Routine ein TShape erzeugt und den selben Parent zugewiesen. Wird angezeigt

Das mit dem Assign habe ich jetzt abgeändert. Funktioniert jetzt alles ohne AVs. Die Bilder werden trotzdem nicht angezeigt... Warum?
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#6

Re: Array of TImage von anderer unit benutzen

  Alt 10. Mai 2007, 13:11
Hat keiner eine Idee wieso das/die Image/s nicht angezeigt werden?

EDIT: Hab das Problem. Ich vergass den Teil wo die Images zugewiesen werden auszuführen bevor die ersten Items erzeugt werden.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:46 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