Lazarus 3.0 (2023.12.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Rács rajzolása komponensre - hogyan? 2024 máj. 08 15:06 #2705

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 81
  • Köszönetek: 1
Ez is sikeresen megoldódott!
A gond az volt, hogy mivel a terepVaszon és a tvracskep is egyazon ScrollBox gyermekobjektumai, ezért a tvracskep a létrejöttekor mintegy eltakarja az események (pl. egérkattintás) elől a terepVaszon-t. Ezen a BringToFront utasítás használatával tudtam segíteni, ami előrébb hozza a sorban az adott objektumot.

Rács rajzolása komponensre - hogyan? 2024 máj. 07 15:34 #2704

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 81
  • Köszönetek: 1
Sikerült! Ezzel a kóddarabbal értem el, hogy a terepVaszon TImage-en létrejöjjön a tvracskep TImage, amelyen csak a rárajzolt rácsok látszódnak, és a vászon nem takarja ki az alatta levő képet:
procedure TForm1.racsmutatoGombMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if vantvracs=true then
  begin
       FreeAndNil(tvracskep);
       vantvracs:=false;
  end
  else
  begin
      tvracskep:=TImage.Create(tvScrBox);
      tvracskep.Parent:=tvScrBox;
      tvracskep.Left:=0;
      tvracskep.Top:=0;
      tvracskep.width:=terepVaszon.width;
      tvracskep.height:=terepVaszon.Height;
      tvracskep.Picture.Bitmap.SetSize(terepVaszon.width,terepVaszon.height);
      tvracskep.Picture.Bitmap.Assign(terepVaszon.Picture.Bitmap);
      tvracskep.OnPaint:=@tvracsrajzolas;
      tvracskep.invalidate;
      vantvracs:=true;
  end;
end;
Apró szépséghibája még e megoldásnak, hogy amikor a tvracskep létezik, akkor nem tudom módosítani a terepVaszon kép tartalmát. Ennek vajon mi lehet az oka?

Rács rajzolása komponensre - hogyan? 2024 máj. 04 10:05 #2703

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 81
  • Köszönetek: 1
És TImage vásznának eltüntetését nem lehet valahogy elérni? Mert most módosítottam a kódon és így a TForm1 bal felső sarkába kirajzolja rendesen a vonalakat háttér nélkül, de nekem a terepVaszon TImage-re (aminek a tvScrBox a szülőobjektuma) kéne rajzolni a tvracskep TImage-et. De azt a fekete háttérvásznat mindig megjeleníti alatta, ha hívom a canvas.line-t, ami vászonnak jelenleg a színét tudtam megváltoztatni csak (brush.color és canvas.clear segítségével).
procedure TForm1.tvracsrajzolas(Sender: TObject);
var vszvonalhely,fugvonalhely: word;
begin
    fugvonalhely:=csempeszel;
    vszvonalhely:=csempemag;
    //with tvracskep do // Ha ezek ki vannak kommentelve, a rács látszódik háttér nélkül,
    //begin // de nem a tvracskep, hanem a Form1 koordinátáiban és nem is tudom eltüntetni.
        canvas.pen.color:=clBlue;
        while fugvonalhely<terepVaszon.width do
        begin
            canvas.line(fugvonalhely,0,fugvonalhely,terepVaszon.height);
            inc(fugvonalhely,csempeszel);
        end;
        while vszvonalhely<terepVaszon.height do
        begin
            canvas.line(0,vszvonalhely,terepVaszon.width,vszvonalhely);
            inc(vszvonalhely,csempemag);
        end;
    //end;
end;
 
procedure TForm1.racsmutatoGombMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
    if tvracsmutat=true then
    begin
        tvracsmutat:=false;
        if vantvracs=true then
        begin
            FreeAndNil(tvracskep);
            vantvracs:=false;
        end;
    end
    else
    begin
        tvracsmutat:=true;
        if vantvracs=false then
        begin
            tvracskep:=TImage.Create(tvScrBox);
            tvracskep.Parent:=tvScrBox;
            tvracskep.Left:=0;
            tvracskep.Top:=0;
            tvracskep.width:=terepVaszon.width;
            tvracskep.height:=terepVaszon.Height;
            tvracsrajzolas(tvracskep);
        end;
        vantvracs:=true;
    end;
end;

Rács rajzolása komponensre - hogyan? 2024 ápr. 22 14:52 #2702

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
Javaslom, hogy átkátszó PNG képeket használj, ha átlátszó elemeket szeretnél megjeleníteni.
A jpg és sok más képtípus alaphelyzetben nem igazán alkalma ilyesmire.

A a GIMP képszerkesztő (vagy más) segítségével egyszerűen átlátszóvá teheted a képeket (esetedben a rács képét tartalmazót).
- Nyisd meg a képet a GIMP képszerkesztőben
- A menüben kattints a "Réteg", "Átlátszóság" majd a "Színből alfa..." lehetőségre
- A megjelenő ablakban a "Szín" sor végén látható pipetta ikonra kattintva választd ki a képen azt a színt mely helyett átlátszóságot szeretnél. (Ekkor a szín helyén az átlátszó hátteret jelző szürke mintás háttér jelenik meg.)
- A menüben kattints a "Réteg", "Átlátszóság" majd a "Alfacsatorna kijelöléssé alakítása" lehetőségre
- A menüben kattints a "Kijelölés", "Invertálás" (megfordítés) lehetőségre
- Nyomd le a DEL gombot a billenytűzeten
Elvileg ekkor csak az a rész marad a kép anyagából amit majd láttatni akarsz.
- A módosított kép mentéséhez a menüben kattints a "Fájl" majd az "Exportálás másként..." lehetőségre
- A megjelenő ablakban a "Név" mezőben a fájl kiterjesztését írd át png-re
- Kattints az "Exportálás" gombra
- Ekkor felugrik a png fájlokhoz tartozó paraméterek ablaka, de itt elvileg nem kell semmit változtatni, ezért csak kattints az "Exportálás" gombra
Kész


 
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

Rács rajzolása komponensre - hogyan? 2024 ápr. 21 13:19 #2699

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 81
  • Köszönetek: 1
Ezt, vagyis egy átmeneti bitmap kép közbeiktatását találtam eddig félmegoldásként, amely bár már kirajzolja a rácsot, de amikor létezik, eltakarja az alatta levő TImage-et. Hiába állítom a Transparent tulajdonságokat true-ra, a rácson kívül feketeséget is kirajzol egy nagy téglalapban, nekem meg csak a rácsvonalak kellenének. Lehetséges egyáltalán ily módon ezt megoldani, vagyis egy másik kép ráhelyezésével a TImage-re? Mindenesetre most ez a kód:
procedure TForm1.racsmutatoGombMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var bm: TBitmap;
  vszvonalhely,fugvonalhely: word;
begin
  if tvracsmutat=true then
  begin
     tvracsmutat:=false;
     if vantvracs=true then
     begin
       FreeAndNil(tvracskep);
       vantvracs:=false;
     end;
  end
  else
  begin
    tvracsmutat:=true;
    if vantvracs=false then
    begin
      tvracskep:=TImage.Create(tvScrBox);
      tvracskep.Parent:=tvScrBox;
      tvracskep.Left:=0;
      tvracskep.Top:=0;
      tvracskep.width:=terepVaszon.width;
      tvracskep.height:=terepVaszon.Height;
      tvracskep.Transparent:=true;
      bm:=TBitmap.Create;
      bm.width:=terepVaszon.width;
      bm.height:=terepVaszon.Height;
      bm.Transparent:=true;
      fugvonalhely:=csempeszel;
      vszvonalhely:=csempemag;
      bm.canvas.pen.color:=clBlue;
      while fugvonalhely<terepVaszon.width do
      begin
          bm.canvas.line(fugvonalhely,0,fugvonalhely,terepVaszon.height);
          inc(fugvonalhely,csempeszel);
      end;
      while vszvonalhely<terepVaszon.height do
      begin
          bm.canvas.line(0,vszvonalhely,terepVaszon.width,vszvonalhely);
          inc(vszvonalhely,csempemag);
      end;
      tvracskep.picture.graphic:=bm;
      FreeAndNil(bm);
    end;
    vantvracs:=true;
  end;
end;

Rács rajzolása komponensre - hogyan? 2024 ápr. 21 08:21 #2697

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

Adott a programomban egy ScrollBox és azon egy TImage komponens. Ezen a TImage-en szeretnék még egy rácsot is rajzolni egy gomb bekapcsolt állapotától függően.
Ehhez most a gomb lenyomásakor, tehát futásidőben létrehozok egy másik TImage-et és annak vásznán rajzolnám ki a rácsot, de nem jelenít meg semmit.
Ez a rácskép létrehozásának kódja:
procedure TForm1.racsmutatoGombMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if tvracsmutat=true then
  begin
     tvracsmutat:=false;
     if vantvracs=true then
     begin
       FreeAndNil(tvracskep);
       vantvracs:=false;
     end;
  end
  else
  begin
    tvracsmutat:=true;
    if vantvracs=false then
    begin
      tvracskep:=TImage.Create(self); //A self helyett próbálkoztam itt más objektumnevekkel is.
      tvracskep.Parent:=tvScrBox;
      tvracskep.Left:=0;
      tvracskep.Top:=0;
      tvracskep.width:=terepVaszon.width;
      tvracskep.height:=terepVaszon.Height;
      tvracskep.OnPaint:=@tvracsrajzolas;
    end;
    tvracskep.invalidate;
    vantvracs:=true;
  end;
end;
ez pedig maga a rajzolás:
procedure TForm1.tvracsrajzolas(Sender: TObject);
var vszvonalhely,fugvonalhely: word;
begin
     fugvonalhely:=csempeszel;
     vszvonalhely:=csempemag;
     brush.color:=clBlue;
     while fugvonalhely<terepVaszon.width do //Próbaképpen függőleges vonalak:
     begin
          tvracskep.canvas.line(fugvonalhely,0,fugvonalhely,terepVaszon.height);
          inc(fugvonalhely,csempeszel);
     end;
end;
Próbáltam TBitmap-ot, de az sem jelenített meg semmit, ráadásul annak Left és Top tulajdonságai sincsenek, hogy a TImage-re igazíthassam.
Aztán kipróbáltam a TPaintBox-ot, ami már megjelenítette, de teljesen takarja az alatta levő képet, és Transparent tulajdonsága sincs, hogy ne takarja.
Esetleg még a TGrid jöhetne szóba, de nem tudom, hogyan használjam és egyáltalán jó-e az én problémám orvoslására.
Hogyan oldható meg végül is ez a kérdés? Fontos, hogy a rács ne legyen része a ScrollBox-on levő TImage-nek, mert azt a képet a rács nélkül kellene elmenteni, tehát a rács külön komponens legyen, ami csak rajta van egy külön rétegként.

  • Oldal:
  • 1