Lazarus 3.0 (2023.12.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Hogyan adhatók képek ScrollBox-hoz futásidőben? 2024 ápr. 07 12:52 #2691

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 78
  • Köszönetek: 1
Időközben megoldottam ez utóbbit is: az yhely változó helyett a Top beépített változó használatával. (Haladhatok tovább a programfejlesztés rögös útján...  )

Hogyan adhatók képek ScrollBox-hoz futásidőben? 2024 ápr. 07 09:26 #2690

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 78
  • Köszönetek: 1
... de most már úgy látszik, sikerült megjelenítenem, mert hozzáadtam a szülőobjektumot kijelölő sort:
csempe[forrascsempedb]:=Tcsempek.Create(forrascsempelista);
     [b]csempe[forrascsempedb].parent:=forrascsempelista;[/b]
Csak még az nem világos, hogy ha új képet nyitok meg, akkor azt miért nem rakja az előző alá a ScrollBox-ban, mert most felülírja az előzőt:
if forrascsempedb=0 then //Pedig ezt a változót mindig növelem 1-gyel a létrehozás végén...
        csempe[forrascsempedb].yhely:=forrascsempelista.Top+2
     else
        csempe[forrascsempedb].yhely:=csempe[forrascsempedb-1].yhely+csempe[forrascsempedb-1].height+2;

Hogyan adhatók képek ScrollBox-hoz futásidőben? 2024 ápr. 07 08:56 #2689

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 78
  • Köszönetek: 1
Amit megnyitok és betallózok kép, arról a CopyRect-tel készül egy másolat a ScrollBox-ra, de ott nem látszik.
Tehát most már ilyen a kódrészlet:

 
 if (kepMegnyito.Execute) and (forrascsempedb<255) then
   begin
     csempeforraskep:=TPicture.Create;
     csempeforraskep.LoadFromFile(kepMegnyito.FileName);
     if forrascsempedb=0 then aktforcsempekep:=1;
     //
     setlength(csempe,forrascsempedb+1);
     csempe[forrascsempedb]:=Tcsempek.Create(forrascsempelista); //A forrascsempelista a ScrollBox neve.
    (...)
csempe[forrascsempedb].canvas.copyrect(Rect(0,0,csempe[forrascsempedb].width,csempe[forrascsempedb].height),csempeforraskep.bitmap.canvas,Rect(0,0,csempeforraskep.width,csempeforraskep.height));
És ezt a csempét kellene a ScrollBox-ra kirajzolnom, ami eddig a draw-val történt:
if forrascsempedb>0 then
  begin
    for i:=0 to forrascsempedb-1 do
    begin
        canvas.draw(csempe[i].xhely,csempe[i].yhely,csempe[i]); //A csempe[i] helyére kellene valami, ha egyáltalán kell a kirajzolás a mutatásához.
    end;
  end;

Hogyan adhatók képek ScrollBox-hoz futásidőben? 2024 ápr. 06 16:40 #2688

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
Mi is az az "eredeti nagy kép" ami nem látszik és hol nem látszik? :)
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Hogyan adhatók képek ScrollBox-hoz futásidőben? 2024 ápr. 06 12:47 #2687

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 78
  • Köszönetek: 1
Köszönöm a segítő választ, Gábor; átírtam a dolgokat a kódban a javasoltra és úgy tűnik, működnek. Egy helyen van még hiányosság: a kép(ek) kirajzolása a ScrollBox-on. Eddig ez volt hozzá a kód:
if forrascsempedb>0 then
  begin
    for i:=0 to forrascsempedb-1 do
    begin
        canvas.draw(csempe[i].xhely,csempe[i].yhely,csempe[i].kepe);
    end;
  end;
De mivel a kepe tulajdonság már nem létezik, ezért megjegyzéssé tettem ezt az egészet. Bár előtte próbáltam kirajzolni a sima csempe, vagy csempe.bitmap meg csempe.canvas utasításokkal, de egyik sem működött. Meglehet, erre az egész kirajzolós kóddarabra már nincs is szükség, ha ScrollBox-ra helyezem a képeket(?). Amik amúgy ott is vannak, mert a CopyRect-tel tudtam kimásolni róla részleteket, amik látszanak is, csak az eredeti nagy kép nem látszik valamiért a ScrollBox-on. Ennek mi lehet az oka? A visible-t is true-ra állítottam, de akkor sem látszódott.

Hogyan adhatók képek ScrollBox-hoz futásidőben? 2024 ápr. 06 11:36 #2686

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
Szerintem legjobb megoldás ha a Tcsempek nem TObject hanem TCustomImage vagy TImage leszármazott és így természetesen van .Parent tulajdonsága, továbbá könnyebb futásidőben kezelni.
Ezzel együtt az új helyzetnek megfelelően módosítanod kell a forráskódot mindenhol, ahol a tényleges bitképre hivatkozol (Tcsempek.kepe). A Tcsempek.kepe (TBitmap) helyett a Tcsempek (TCustomImage vagy TImage leszármazott) tipusú változóra hivatkozást kell alkalmazni. Ahol pedig a Tcsempek-hez általad megadott tulajdonságaira hivatkozol ott marad minden ahogy van.
type Tcsempek = class(TCustomImage)
public
    //kepe: TBitmap; // ez már nem kell
    xhely,yhely,nezetx,nezety,kepszel,kepmag,nezetszel,nezetmag: word;
end;

Azért mielőtt nekiállsz készíts egy biztonsági másolatot a projektedről.
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Hogyan adhatók képek ScrollBox-hoz futásidőben? 2024 ápr. 06 10:09 #2685

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 78
  • Köszönetek: 1
Sziasztok!

Az a probléma bukkant fel programfejlesztés közben, hogy adott egy ScrollBox, amibe az OpenPictureDialog által megnyitott képeket szeretném elhelyezni, de nem sikerül, mert nem tudom, hogy ezen képekenek hol és hogyan adhatom meg szülőnek a ScrollBox-ot.
Tehát a TForm1.FormCreate-ben van ez a kód a ScrollBox létrehozására:
forrascsempelista:=TSCrollBox.Create(self);
forrascsempelista.Left:=0;
forrascsempelista.Top:=gombKepAd.height+8;
forrascsempelista.width:=(width div 2)+4;
forrascsempelista.height:=height-gombKepAd.height-8;

aztán a képek megnyitása:
procedure TForm1.gombKepAdClick(Sender: TObject);
begin
   if (kepMegnyito.Execute) and (forrascsempedb<255) then
   begin
     csempeforraskep:=TPicture.Create;
     csempeforraskep.LoadFromFile(kepMegnyito.FileName);
     //
     setlength(csempe,forrascsempedb+1);
     csempe[forrascsempedb]:=Tcsempek.Create;
     csempe[forrascsempedb].xhely:=forrascsempelista.Left+2;
     if forrascsempedb=0 then
        csempe[forrascsempedb].yhely:=forrascsempelista.Top+2
     else
        csempe[forrascsempedb].yhely:=csempe[forrascsempedb-1].yhely+csempe[forrascsempedb-1].kepe.height+2;      csempe[forrascsempedb].kepe.width:=csempeforraskep.width;
     csempe[forrascsempedb].kepe.height:=csempeforraskep.height;      csempe[forrascsempedb].kepe.canvas.copyrect(Rect(0,0,csempe[forrascsempedb].kepe.width,csempe[forrascsempedb].kepe.height),csempeforraskep.bitmap.canvas,Rect(0,0,csempeforraskep.width,csempeforraskep.height));
     inc(forrascsempedb);
     freeandnil(csempeforraskep);

míg a Tcsempek osztály leírása:
type Tcsempek = class(TObject)
  private
  public
    kepe: TBitmap;
    xhely,yhely,nezetx,nezety,kepszel,kepmag,nezetszel,nezetmag: word;
end;

És ezeknek a csempeképeknek kellene valahogy szülőnek beállítanom a ScrollBox-ot, hogy az tartalmazza őket és megjelenjenek a gördítősávok is benne - legalábbis ennyit sikerült eddig kiböngésznem az internetről, hogy a szülőként való beállítása elég kellene, hogy legyen ahhoz, hogy beleigazítódjanak egymás alá a megnyitott képek és görgetni lehessen őket, ha sokan vannak.
De sem ez:
csempe[forrascsempedb].parent:=forrascsempelista;
sem ez:
csempe[forrascsempedb].kepe.parent:=forrascsempelista;
nem jó, hiszen parent tulajdonság ezeknél nem létezik.
De akkor hogyan oldható meg ez a kérdés? Van esetleg van a parent lehetőség alkalmazásán kívül is valami megoldása?

  • Oldal:
  • 1