Delphi programozás - Szoftverfejlesztés fórum

üzenetek

hozzászólások


vz12
(tag)

Próbálj meg közvetlenül a "$" után írni 2 db "0"-t, tehát pl. TColor($00FF0000).
Arra figyelni kell, hogy a színek sorrendje a "00" után NEM a normális "R-G-B", hanem "B-G-R", tehát fordított, viszont úgy látom, hogy ezt jól csináltad, legalábbis a KÉK szín esetén, a fehér viszont szerintem $00FFFFFF.

[ Szerkesztve ]


Tomi_78
(tag)

Még mindig nem jó... :( "Identifier idents no member" hibaüzenetet ad a GetPixelnél és a SetPixeleknél is. Lehet, hogy ezek nincsenek is benne a Lazarusban? Pedig elvileg a Graphics unitnak tartalmaznia kellene.
A színeket meg innen puskáztam ki: [link]


Tomi_78
(tag)

Na, ez érdekes: itt az olvasható, hogy a Windows unit kell a GetPixelhez és a SetPixelhez: [link]
Viszont ha a unitok felsorolásához hozzáírom a Windows-t is, akkor a Rect megadásakor (ez máshol szerepel a programomban) hibát kapok, ugyanis ha fölé viszem az egeret, akkor Windows unit nélkül azt írja ki, hogy a Classes-ba tartozik, a Windows unit megadásakor meg azt, hogy ebbe a Windows-ba és hibát kapok, mert nem téglalaprajzolásnak érzékeli, hanem record-nak.
Ki érti ezt...?


Tomi_78
(tag)

No szóval, most így sikerült úgy-ahogy megoldanom:
if vizdb>0 then
  begin
       for i:=1 to vizdb-1 do
       begin
            if random(100)=1 then
            begin
              for vsz:=viztomb[i,0] to viztomb[i,0]+palyakep.width div 8 do
                  for vm:=viztomb[i,1] to viztomb[i,1]+palyakep.height div 8 do
                  begin
                       if (random(100)=1) and (palyakep.canvas.Pixels[vsz,vm]=clBlue) then
                       begin
                         palyakep.Canvas.Brush.Color:=clWhite;
                         palyakep.canvas.fillrect(vsz,vm,vsz+1,vm+1);
                       end
                       else if (random(100)=1) and (palyakep.canvas.Pixels[vsz,vm]=clWhite) then
                       begin
                         palyakep.Canvas.Brush.Color:=clBlue;
                         palyakep.canvas.fillrect(vsz,vm,vsz+1,vm+1);
                       end;
                  end;
            end
            else Continue;
       end;
  end;
De valamiért gyanúsan sok fehér képpontot tesz ki, úgyhogy még gondolkodom ezen az egészen...


vz12
(tag)

> A színeket meg innen puskáztam ki: [link]
A fehér ott sem $000000 ... :N
De a "clWhite", "clBlue" az rendben van. :)

Esetleg a
"palyakep.canvas.fillrect(vsz,vm,vsz+1,vm+1);" helyett pl . a
"palyakep.canvas.Pixels[vsz,vm]:=clWhite;" nem lenne szebb?

A 3 db "random(100)"-at sokallom egy kicsit, de te látod az eredményt, ha jó, akkor jó.
Remélem, hogy "Randomize;" van a program elején ...

[ Szerkesztve ]


Tomi_78
(tag)

Akkor a Pixels nemcsak lekérdezésre használható, de értéket is lehet neki adni?
A Randomize-t természetesen odaraktam a program elejére. :K


vz12
(tag)

> Akkor a Pixels nemcsak lekérdezésre használható, de értéket is lehet neki adni?

Én már használtam úgy, bár régen és NEM Lazarus-ban, hanem "normál" Delphi-ben, ott működött.
Szerintem "illene" működni Lazarus-ban is. Próbáld ki. :)

[ Szerkesztve ]


Fire/SOUL/CD
(félisten)
Blog

A Pixels a SetPixel és GetPixel függvényekre támaszkodik, a Graphics unit-ban találhatóak.

property Pixels[X, Y: Integer]: TColor read GetPixel write SetPixel;

[ Szerkesztve ]


Tomi_78
(tag)

Köszönöm mindkettőtöknek a választ; kipróbáltam és működött! :K


Tomi_78
(tag)

Sziasztok!
Elakadtam kis játékprogramomban a radarképernyő elkészítésével. Azt hittem, hogy ez egy egyszerű arányszámítás lesz a pálya és a radarképernyő adatainak összevetésével, de valahogy mégsem jön össze nekem. Nagyon frusztrált vagyok emiatt... :((
Tehát az a kérdésem, hogy játékpálya és annak nézete alapján hogyan lehet elkészíteni annak kicsinyített mását, egy radarképernyőt, amelyen a téglalap pontosan ott foglal helyet, ahol a játéktéren is a nézet.
Így próbálkoztam:
radnezetszel:=((opanelkep.width-4)*form1.width) / palyakep.canvas.width;
radnezetmag:=((opanelkep.width-4)*form1.height) / palyakep.canvas.height;
radxtav:=((opanelkep.width-4)*radpalyakepx) / palyakep.canvas.width;

//Az oldalpanelképen van a radartérkép, mely szélessége=a magasságával, ezért az Y-nál is ugyanaz:
radytav:=((opanelkep.width-4)*radpalyakepy) / palyakep.canvas.height;
radt:=rect(2+round(radxtav),kilepgomb.top+kilepgomb.height+8+round(radytav),2+round(radxtav)+round(radnezetszel),kilepgomb.top+kilepgomb.height+8+round(radytav)+round(radnezetmag));
canvas.drawfocusrect(radt);

Az eredmény(telenség) a mellékelt képen látható: van téglalap a radartérképen, de nem egészen ott, ahol lennie kéne (a kékség egy folyó lenne, a zöldes mezőn):


Fire/SOUL/CD
(félisten)
Blog

Így első nekifutásra az elv jónak néz ki, csak mégsem jó az arány, amit okozhat ennek a sornak a hibája:
radnezetmag:=((opanelkep.width-4)*form1.height) / palyakep.canvas.height;

opanelkep.width-4 helyett opanelkep.height-4 kellene...


Fire/SOUL/CD
(félisten)
Blog

Ehhh, egy "kicsit" régi hsz-ra válaszoltam... :DDD


Tomi_78
(tag)

Sziasztok ismét!
Egy olyan kérdésem van, ami sokatoknak biztosan egyszerűen megválaszolható lesz - remélhetőleg:
kirajzolok egy gombot Lazarus-ban a képernyőre, és erre bal gombbal kattintva meg kéne jelennie egy 2-3 elemből álló legördülő menünek. Ezt hogyan kell megcsinálni futásidőben, kóddal?
Innen: [link] puskázva eljutottam addig, hogy valószínűleg így kell létrehozni:
mnuMainMain = TMainMenu.Create(Form1);
de hogyan adhatom hozzá a menüpontokat és hogyan kezelhetem le a rájuk történő kattintást?
Tehát valami olyasmi kéne pl. hogy:
1. rákattintok a gombra, erre legördül egy 2-3 elemből álló menüsor,
2. ha valamelyikre kattintok, történjen valami, pl. kiírni, hogy melyikre kattintottam, és tűnjön el a menü,
3. akkor is záródjon be, ha a legördített menüpontokon kívülre kattintottam.


vz12
(tag)

Hello!

Miért kell futásidőben létrehozni? Helyzettől függően változik a tartalma?
Amúgy szerintem neked TPopupMenu kell inkább.
Ennek van egy "items" property-je, ami tartalmazza az egyes menüpontok objektumait szépen sorban, és amelyikhez van "onclick", az végrehajtja az ottani kódot. Azt hiszem, hogy az egyes menüpontokat lehet "disabled/enabled" állapotba is tenni (valahogy), tehát én inkább tervezési időben rátenném a formra a popup menüt, meg az elemeit, meg az onclick-eket, futásidőben legfeljebb ki/bekapcsolgatnám a menüpontokat helyzettől függően.
Vagy TÖBB popup menüt is lehet csinálni, és mindig a megfelelőt kell aktiválni.

Én sosem használtam Lazarust, csak régebben "rendes" Delphi-t, de szerintem ez nem nagyon különbözhet egymástól.

Találtam Lazarushoz linket:
[link]


Fire/SOUL/CD
(félisten)
Blog

Azt tudom javasolni Én is, amit vz12 kolléga is, ne foglalkozz futásidejű létrehozással (már ami a popup-okat illeti), sokkal egyszerűbb IDE-ben, a TpopupMenu objektumot használni, ebből annyit dobhatsz a form-ra, amennyit csak szeretnél, duplaklikkel meg szerkesztheted őket a beépített editorral ( elem neve, felirata és minden egyes elem onclick eseményét is). Mindenféle programozás nélkül, ha hozzárendelsz egy pl. Button-hoz egy popup-t(egyszerre értelem szerűen csak 1-t, de a létrehozott popup menük közül bármelyiket futás időben is Button1.PopupMenu:=TPopupMenu(PopupMenu2);), akkor az úgy fog működni, hogy a gombon jobb egérrel kattintva fog megjelenni.
Le is lehet tiltani (futás időben is, ha ez az igény), hogy megjelenjen avagy sem jobb egérre, ehhez az AutoPopup tulajdonságot lehet használni, pl:
Button1.PopupMenu.AutoPopup:=False;, ez elrejti a Button1 popupját...

[kép] | [kép]

[ Szerkesztve ]


Tomi_78
(tag)

Sziasztok és köszönöm a válaszokat! Átnézem a javasolt dolgokat mindjárt. Egyébként a program jellegéből fakad, hogy futásidőben van szükség a menüre, mert ez nem olyan, hogy a Form-ra vannak pakolva a dolgok.
A TpopupMenu mindenképpen csak jobb kattintással hozható elő? Mert nekem bal egérgombbal kéne...


Fire/SOUL/CD
(félisten)
Blog

"A TpopupMenu mindenképpen csak jobb kattintással hozható elő? Mert nekem bal egérgombbal kéne..."
Akkor a (példánál maradva) Button1-nek a popup.autopopup tulajdonságát false-ra állítod (IDE-ben ) [kép] majd az onclikbe meg ez:

procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.PopupMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
end;

UI: A Tpopupmenu objektum(ok) futásidőben nem látszódik/látszódnak...

[ Szerkesztve ]


Tomi_78
(tag)

Na, próbálkoztam így:
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  epitmenu: TMainMenu;
  menupont: TMenuItem;
begin
if epitesgomb.aktkepe<>epitesgomb.kepe0 then
     begin
      epitesgomb.aktkepe:=epitesgomb.kepe0;
      epitmenu:=TMainMenu.Create(self);
      menupont:=TMenuItem.Create(epitmenu);
    menupont.Caption:='Felirat';
      epitmenu.items.Add(menupont);
     end;
end;

és erre a képernyő tetején létrehoz egy, a képernyő szélességével megegyező szélességű fehér téglalapot, benne a felirattal... :F
Hogyan lehet ezt a gomb koordinátáihoz igazítani és megfelelő szélességűre?


vz12
(tag)

NEM "TMainMenu"-ről volt szó, hanem "TPopupMenu"-ről ...
A főmenü helye valóban az ablak tetején egy teljes szélességű "csík", nézz meg bármilyen "normális" alkalmazást, neked NEM ez kell.
Arról is volt szó, hogy TERVEZÉSI időben nyugodtan létre lehet hozni a popup menüt, alapból nem fog látszódni, csak egérkattintás utáni aktivizáláskor (kóddal), és automatikusan el is fog tűnni, vagy a menüpont kiválasztásakor (ilyenkor végrehajtja a mögé írt kódot is), vagy a menü területén kívüli kattintásra (ilyenkor nem csinál semmit). Az eltüntetés beépített feature, azt nem kell kódolni.
Tervezési időben a megfelelő elemet (TPopupMenu) oda kell tenni a formra, és a beépített szerkesztővel fel lehet venni az elemeket + az OnClick eseményre lehet kódot írni szintén előzetesen. Futásidőben CSAK aktiválni kell az előre elkészített popup menüt, ami megjelenik + a fent említett esetekben automatikusan eltűnik, semmilyen "téglalap" nem marad utána.
A korábban megadott linket érdemes tanulmányozni, vagy valamilyen hasonlót lehet keresni a neten, az meg fogja erősíteni az általunk írtakat.

Ja , "mbRight" helyett neked "mbLeft" fog kelleni, így a BAL egérgomb kattintásra fog aktiválódni a popup menü.

[ Szerkesztve ]


Fire/SOUL/CD
(félisten)
Blog

Én (meg vz12 sem) ezt mondtam/mondtuk... Nem is értem mi a faxt csinálsz, de tényleg... :W

UI: Ja, látom vz12 is írt éppen...

üzenetek