Toon posts:

[DelphiX] Kopieren pattern naar andere imagelist

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit wat te knooien met Delphix, en ik heb daarmee nu het volgende probleempje:

Ik wil namelijk 1 pattern uit een plaatje die in een dximagelist(1) staat kopieren naar een nieuw plaatje in een andere dximagelist(2).

Het nieuwe plaatje aanmaken in de andere dximagelist(2) is niet zo'n probleem, maar het lukt me niet om de pattern uit de ene dximagelist(1) naar dit nieuwe plaatje in de andere dximagelist(2) te kopieren.

Het probleem zit namelijk in het opvragen van de picture van een pattern.

Ik kan namelijk zo gauw even niet een DXImagelist1.items[0].pattern.picture ofzo opvragen.

Ik heb het ook al geprobeerd via gewone images te kopieren, maar dat lukt ook niet helemaal.


Het liefst zou ik dus direct van pattern naar een andere dximagelist kopieren.

(Ojah, eem ik moet zo van meerdere plaatjes in Dximagelist(1) meerdere patterns kopieren naar dximagelist2... dus het moet ook nog een beetje te loopen zijn eigenlijks :D)

dus mijn vraag is eigenlijk, heeft iemand een oplossing voor mijn grote delphix probleem?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Kan je misschien aangeven wat je geprobeert hebt (code?) en wat er dan niet lukte?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Om die patterns te kopieren naar een andere imagelist wou ik zoiets als dit gebruiken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for i := 0 to DXImageList4.Items[0].PatternCount - 1 do begin

        DXImageList2.Items.add;
        with DXImageList2.Items[i] do
        begin
          picture := DXImagelist4.items[0].pattern[0].picture;  
         //maar dit werkt dus  niet :)
          name := 'tile_'+inttostr(i);
          Systememory := false;
          Transparent := true;
          Transparentcolor := clfuchsia;
          Restore;
        end;
end;

Anniewee, om het via die 2 images te kopieren gebruikte ik zoeits als dit:

code:
1
2
3
4
5
6
7
8
9
Image1.Picture := DXImagelist4.items[0].picture

Image2.Canvas.CopyRect(Rect(0,0,32,32),
Image1.Canvas,Rect(0,0,32,32));

DXImageList2.Items[0].Picture := Image2.Picture;

//en hier had ik dus al ff imagelist2.items[0]  
van te voren aangemaakt...


Maar bij dit voorbeeld begint delphi te zeuren dat hij de copyrect niet kan uitvoeren omdat image1.picture leeg is... :S

ik kan het misschien wel met loadfromfile doen ofzo, dus dat ik het plaatje wat normaal in dximagelist4 staat, direct vanuit een bestand in image1 laad, en dan verder verwerk, maar dat vondt ik niet zo'n mooie oplossing, omdat ik het liever ingebakken in de applicatie heb... (wat met een imagelist wel kan dus...)

[ Voor 19% gewijzigd door Verwijderd op 11-09-2003 13:39 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

een TPicture heeft ook een assign method, probeer die eens.
Delphi:
1
picture.assign(DXImagelist4.items[0].pattern[0].picture);

En anders kan ik me voorstellen dat een
Delphi:
1
DXImagelist2.items[0].assign(DXImagelist4.items[0])

ook wel werkt mits je rekening houdt met het aantal items in DXImagelist2 en 4.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

DelphiX ken ik niet en misschien dat onderstaande tips dus geheel niet werken, maar misschien ook wel:
Je hebt het over LoadFromFile; waarschijnlijk heb je dan ook een LoadFromStream. Dit kost dan wat geheugen maar je hoeft geen filemanagement te doen (scheelt weer deleten van temporary files).
Heeft de picture een handle want vaak kun je doormiddel van het assignen van het juiste handle hetzelfde plaatje krijgen, let wel dat dit geen kopie is maar misschien is het voor jouw probleem/uitdaging voldoende.
Heeft de desbetreffende picture ook een methode draw waarmee je een andere source (bitmap/picture/whatever) kunt tekenen. Op die manier maak je dus een kopietje al zal dit niet de snelste methode zijn.

Verwijderd

Topicstarter
dank voor jullie tips, ik ben al weer een stuk verder dan net :D


het is me nu gelukt om een item uit een dximagelist te kopieren naar een losse image. met:

Delphi:
1
image1.Picture.Assign(DXImageList1.Items[0].Picture);


Dat werkt nu, maar nu moet ik eigenlijk nog een klein stukje (wat dus normaal 1 pattern was kopieren naar een andere image om die dan weer te kopieren naar een nieuw item in een andere DXImageList.

dat zou in principe met deze code moeten werken:

Delphi:
1
2
Image2.Canvas.CopyRect(Rect(0,0,32,32),Image1.Canvas,
Rect(0,0,32,32));


Maar het probleem is (nu weer) dat ik de foutmelding krijg:

'Can only modify an image if it contains a bitmap'

Maar in image1 op mn form zie ik toch echt wel een bitmapje uit dximagelist1 staan.

wanneer ik hem dus met copyrect kopieer lijkt hij dus leeg te zijn,

Wanneer ik echter ipv

Delphi:
1
image1.Picture.Assign(DXImageList1.Items[0].Picture);


even voor te testen:

Delphi:
1
2
Image1.Picture.LoadFromFile(Extractfiledir
(Application.ExeName+'\bitmap.bmp');


dit gebruik, dan gaat het wel weer goed,

moet ik in image1 nog iets aanmaken ofzo?

[ Voor 7% gewijzigd door Verwijderd op 11-09-2003 15:44 ]


Verwijderd

Topicstarter
ik heb het via een omweggetje nu toch voor mekaar gekregen, misschien is het niet de meest nette manier, echter vindt ik het voor mijn progje netjes zat tot nu toe...

ziehier:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
image1.Picture.Assign(DXImageList1.Items[0].Picture);
image1.Picture.SaveToFile
(Extractfiledir(Application.ExeName)+'\buffer.bmp');

Image1.Picture.LoadFromFile
(Extractfiledir(Application.ExeName)+'\buffer.bmp');

DeleteFile(Extractfiledir(Application.ExeName)+'\buffer.bmp');

Image2.Canvas.CopyRect(Rect(0,0,32,32),
Image1.Canvas,Rect(33,0,33+32,32));

DXImageList2.Items.Add;
  With DXImageList2.Items[0] do
      begin
          Picture := Image2.Picture;
          Name := '';
          PatternWidth := 0;
          PatternHeight := 0;
          SkipWidth := 0;
          SkipHeight := 0;
          Systemmemory := False;
          Transparent := false;
          TransparentColor := clFuchsia;
          Restore;
      end



iig, bedankt voor al jullie hulp, kan nu gelukkig weer vrolijk verder proggen aan mn kleine lieve appje O+

[ Voor 3% gewijzigd door Verwijderd op 11-09-2003 16:44 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 11 september 2003 @ 15:42:
dank voor jullie tips, ik ben al weer een stuk verder dan net :D


het is me nu gelukt om een item uit een dximagelist te kopieren naar een losse image. met:

Delphi:
1
image1.Picture.Assign(DXImageList1.Items[0].Picture);


Dat werkt nu, maar nu moet ik eigenlijk nog een klein stukje (wat dus normaal 1 pattern was kopieren naar een andere image om die dan weer te kopieren naar een nieuw item in een andere DXImageList.

dat zou in principe met deze code moeten werken:

Delphi:
1
2
Image2.Canvas.CopyRect(Rect(0,0,32,32),Image1.Canvas,
Rect(0,0,32,32));


Maar het probleem is (nu weer) dat ik de foutmelding krijg:

'Can only modify an image if it contains a bitmap'
En mijn tweede tip met assign? (dus iets ala imagelist.items[0].assign?)
Let er wel op dat het dus ook daadwerkelijk bitmaps moeten zijn. Als je bijv. JPEG's laad zul je van de TImage eerst DIBNeeded moeten aanroepen om er ook daadwerkelijk een bitmap van te maken.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1