Lazarus 3.2 (2024.02.28.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Eseménykezelés nem Form1 szülőjű objektumnál 2024 febr. 29 10:50 #2684

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Sikerült is ennek alapján megfelelően elhelyeznem a vásznat.
De még egy kérdés felmerült: a ScrollBox-on elhelyezett Image vászna mindig csak akkora, amekkora a látható területe? A CopyRect()-tel másolgatok ki belőle részleteket, és ez csak addig működik megfelelően, míg arrébb nem gördítem a vásznat. Ha elmozdul, akkor kisebb méretű fehér képeket ad vissza a CopyRect() belőle. Meg az is gyanús, hogy ha az Image legszélére kattintok, akkor a görgetősávok is belekerülnek a kimásolt kisképbe, holott azt várnám, hogy a kép folytatólagos részei lesznek benne.
Az alábbi kódom végzi ezt az egészet:
procedure TForm1.csempekeprekatt(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var i: byte;
begin
     for i:=0 to forrascsempedb-1 do
     begin //Csempeképre kattintottunk?
       if (X>=csempekepek[i+1].Left) and (X<=csempekepek[i+1].Left+csempekepek[i+1].width) and (Y>=csempekepek[i+1].Top) and (Y<=csempekepek[i+1].Top+csempekepek[i+1].height) then
       begin
            if vanatrakandocsempe=false then
            begin
              atrakandocsempe:=TImage.Create(Self);
              atrakandocsempe.Parent:=self;
              atrakandocsempe.Left:=X;//+csempekHelye.HorzScrollbar.position;
              atrakandocsempe.Top:=Y;//+csempekHelye.VertScrollbar.position;
              atrakandocsempe.width:=csempeszel;
              atrakandocsempe.height:=csempemag;
            end;
            atrakandocsempe.canvas.copyrect(Rect(0,0,csempeszel,csempemag),csempekepek[i+1].canvas,Rect(X,Y,X+csempeszel,Y+csempemag));
            vanatrakandocsempe:=true;
            Break;
       end;
     end;
end;

Eseménykezelés nem Form1 szülőjű objektumnál 2024 febr. 29 08:15 #2683

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Akkor ha jól értem, annyiszor tolódik el a gyermekobjektum koordinátája, amennyi szülője van és azok 0-nál nagyobb koordinátákkal(?).
Köszönöm a magyarázatot; akkor ennek megfelelően állítom be az értékeit.

Eseménykezelés nem Form1 szülőjű objektumnál 2024 febr. 28 14:40 #2682

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
A .Top és a .Left tulajdonságok mindig a szülőhöz képest (azon belül) értelmezendők.
Tehát ha a ScrollBox.Top=10 és az Image.Top=10 akkor a Form.Top-hoz képest a látható helyzet 10 (ScrollBox) és 20 (Image) lesz.
 
Ha a szülő (ScrollBox) teljes méretére akarod nagyítani a gyermeket (Image) akkor használd az Image.Align:=alClient lehetőséget vagy az Image.Left és az Image.Top is nulla legyen...
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
Mellékletek:

Eseménykezelés nem Form1 szülőjű objektumnál 2024 febr. 28 13:23 #2681

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Mégis sikerült a vászonra alkalmaznom az eseményt! Az volt a baj, hogy a ScrollBox jobb felső sarkába kerül valahogy a vászonkép, így csak akkor érzékeli a rákattintást, amikor oda is görgetek. Pedig úgy van beállítva, hogy a vászonkép mérete megegyezik a ScrollBox-éval, ahogy a Left és Top tulajdonsága is...

Eseménykezelés nem Form1 szülőjű objektumnál 2024 febr. 28 10:33 #2680

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

Abba a problémába futottam programozás közben, hogy ha van egy TImage típusú, "Vaszon" nevű képobjektumom, amely egy TScrollBox-on belül van, ami tehát a szülője neki, akkor erre a vászon képobjektumra hogyan alkalmazhatok eseményeket?
Hozzárendeltem már ugyanis egy OnMouseUp-ot, de ez egyáltalán nem fut le, ha rákattintok, még egy ShowMessage üzenetet sem ír ki, ha próbaképpen azt rakom bele. Ez vajon azért van, mert nem a TForm1 a szülője, hanem az azon belül levő TScrollBox?
Az Objektumfelügyelő így adta hozzá ezt az OnMouseUp-ot:
procedure TForm1.VaszonMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Ez azt jelenti, hogy a TForm1-et érzékeli szülőjének? Ha átállítom szülőjére a TForm1-et, az sem jó, ráadásul ez azért is nem megfelelő nekem, mert így nem tudom görgetni a Vásznat, mivel nem a ScrollBox-on lesz.
Hogyan lehet mindezt megoldani? Azt kéne megoldanom, hogy legyen egy görgethető képem, ha kilógna a képernyőről, illetve hogy a CopyRect()-tel tudjak rátenni kisebb képrészleteket.

  • Oldal:
  • 1