Lazarus 3.2 (2024.02.28.)
Letöltés

  • Oldal:
  • 1
  • 2
  • 3

TÉMA:

Egy kezdő Lazarus használó kérdései 2016 jan. 06 08:54 #1747

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
Szükség van a cél-rendszernek megfelelő unit-okra is a keresztfordításhoz (ez esetedben a win32 RTL, FCL, LCL összetevőket jelenti, más rendszerek esetén még sok más dolgot is).
Legegyszerűbb ha először a 32-bites Lazarus-t telepíted és csak az után a 64-bitest.
A telepítő mellett ot van a windows változatokra történő keresztfordításhoz szükséges kiegészítő állományok telepítője is...

Ha a 2.6 sorozatú FPC-vel működő változatot telepítesz akkor tudnod kell, hogy a 64-bites használatát windows-on nem javasolják a fejlesztők, mert azokban a SEH kivételek még nincsenek kezelve és az elkészített alkalmazások instabilak lehetnek.
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
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2016 jan. 06 07:49 #1745

  • mikiR2
  • mikiR2 profilkép
  • Új tag
  • Új tag
  • Hozzászólások: 9
  • Köszönetek: 0
Sziasztok most használom először a lazarus-t.
Telepítettem a lazarus 64-bites verzióját windows 8.1 re.

És az lenne a problémám hogy a 64 bites verzióval nem sikerült lefordítani 32 bitesre.

A 64 bites verzióval lehet fordítani 32 bitesre?
És ha igen akkor tudnátok segíteni?
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 31 14:37 #1739

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
Köszönjük, hogy megosztottad velünk a munkád gyümölcsét.
Néhány futó pillantást vetettem a forráskódra és van néhány építő jellegű javaslatom arra az esetre ha nem csak windows-on, hanem más rendszereken is szeretnéd használhatóvá/lefordíthatóvá tenni a programod:
  • Próbáld ki és használd az FPSound (vagy a PlaySoundPackage ) csomagot a hangok lejátszásához. A legtöbb esetben működni fog az alapértelmezés szerint telepített rendszerösszetevőkkel.
  • Könyvtárelválasztóként ne a \ jelet hanem a DirectorySeparator állandót használd, mely a forráskód lefordításakor minden rendszerhez a megfelelő könyvtárelválasztó jelet tartalmazza. A Unix típusú rendszereken (Linux, BSD, MacOS stb.) csak a / jel használható e célra.
  • Az ablak átméretezésekor nem kívánatos dolgok történnek. A játékteret (amit most a főablakban közvetlenül jelenítesz meg) egy közbeiktatott, állandó méretű képpel (és játéktérrel) oldd meg. Ezt aztán a StretchDraw() használatával egy az egyben átméretezve rajzolhatsz ki a főablakra... vagy ne engedd meg a főablak átméretezését, ennek egyik módja ha a .Constraints értékeit beállítod és a .BorderStyle pedig legyen például bsSingle vagy bsDialog
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
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 31 13:10 #1738

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Sziasztok! Végre elkészült első (és remélhetőleg nem utolsó) játékprogramom a Lazarus-szal! :laugh: A címe: Space Defender.
Innen tölthetitek le: LETÖLTÉS
Sajnos van egy-két bug benne, amit ezidáig nem tudtam megoldani, úgyhogy ha valaki ezek megoldásában segíteni tudna, annak nagyon örülnék. A fő hiba az, hogy az ellenségek lövései néha rossz helyen jelennek meg, pedig én az ellenséges űrhajóobjektumok aktuális koordinátáira hozom őket létre, de mégis máshol bukkannak fel. A többi hiba leírását lásd a fenti letöltési oldalon.
Végül, ezúton szeretnék Gábornak köszönetet mondani a segítségeiért, amit a Lazarus-szal való ismerkedésem során nyújtott (a jóisten tartsa meg ezen szokását :) ), és Boldog Új Évet kívánni mindenkinek! :cheer:
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 24 09:33 #1732

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Köszönöm a választ; a ClientWidth elé FoAblak-ot írva a TFoAblak helyett most már működik! Csak azt hittem, hogy a ClientWidth, Caption és társaik olyan globális változók, amelyek mindig és mindenhol elérhetőek.
De a lényeg az, hogy most már jó. :)
És ezúton szeretnék Neked és a Lazarus Magyarország honlap közösségének boldog karácsonyt kívánni!
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 23 19:00 #1731

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
Egy osztály(!) elemeit csak az adott osztály (vagy leszármazottainak) metódusaiból lehet (osztálynév előtaggal vagy a nélkül) elérni:
type
	TOsztalyTipus=class(TObject)
		Szam:Integer;
		procedure SajatValami;
	end;
 
procedure TOsztalyTipus.SajatValami;
begin
	Szam:=0;
end;
Egy (bármilyen) osztály típusú változó(!) elemeit bárhonnan elérheted, ha változónév előtaggal hivatkozol rájuk:
var
	Valtozo:TOsztalyTipus;
 
procedure KulsoValami;
begin
	Valtozo.Szam := 0;
end;
... de soha nem fog működni a következő:
type
	TOsztalyTipus=class(TObject)
		Szam:Integer;
	end;
 
procedure KulsoValami;
begin
	TOsztalyTipus.Szam := 0;
end;
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
Megköszönték: Tomi
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 23 18:13 #1730

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
És az miért van, hogy írtam egy saját eljárást (procedure), amit annak rendje s módja szerint előre deklaráltam az interface részben, majd kidolgoztam az implementation részben a többi fölött, működik is, de olyan változókat nem tudok benne elérni, mint pl. a ClientWidth, vagy éppen a TFoAblak.Caption, mert ha ezeket használnám, akkor a következő hibaüzenetet kapom:
unit1.pas(62,5) Error: Only class methods, class properties and class variables can be referred with class references
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 21 17:48 #1729

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
Ez a hibaüzenet arra a sorra vonatkozik ahol a deklaráció van, hiszen az nincs kidolgozva később.
Valószínűleg nem jó a kidolgozás fejléce, például lefelejtetted a kidolgozásnál az osztály-előtagot, esetleg procedure helyett function van vagy ilyesmi...
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
Megköszönték: Tomi
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 21 17:37 #1728

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
És ezt a hibaüzenetet miért kapom?
unit1.pas(20,15) Error: Forward declaration not solved "TFoAblak.ellensegkirakas;"
Hiszen ezt a saját eljárást ("ellensegkirakas") éppen abban a sorban deklarálom előzetesen, és aztán az implementation rész után részletesen megadom.
Akkor most rossz helyre írok valamit, vagy kihagytam valamit?
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 21 14:47 #1727

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Köszi, már értem! Betettem a rajzolást az időzítéshez, és így már működik. Így viszont a Form-on TImage-ként eleve elhelyezett kép nem látszik, csak az elmozdulásakor, de ezt már meg tudom oldani, hogy akkor ezt is futásidőben rakom ki.
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 20 16:39 #1726

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
Az eseménykezelő eljárások csak és kizárólag valamely esemény bekövetkeztekor vagy "kényszer" hatására futnak le.

Az OnPaint eseménykezelő például akkor fut ha szükség van az adott elem kirajzolására vagy a programozó ezt közvetve vagy közvetlenül kéri: bizonyos műveletek következményeként a Paint metódus meghívásra kerül, ami az OnPaint eseménykezelő futását is előidézi.
A folyamatos frissítést csak időzítővel vagy valamilyen más ismétlődő ciklus (for/repeat) használatával érheted el (ez utóbbi módszert GUI alkalmazásokban nem javaslom).

Minden kirajzolást ugyanabban az időzített eljárásban végezz el. Természetesen az időzítést úgy kell beállítanod, hogy elég időt hagyj a rajzolási és számolási műveletek számára...
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
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 20 14:05 #1725

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
A főablak, tehát a TMain-nak az OnPaint-eseményében a FormPaint használható a folyamatos kirajzoláshoz? Vagy ez mire jó? Mert ott íratom ki néhány változó értékét, de nem úgy tűnik, hogy folyamatosan frissülne az értékük...
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 16 14:54 #1722

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
Canvas.Clear;
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
Megköszönték: Tomi
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 16 14:39 #1721

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Az újrarajzoltatáshoz beírtam, hogy:
FoAblak.Canvas.Refresh;
De nem történik rá semmi... :-/
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 16 14:02 #1720

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
Ahhoz hogy a képernyőről is eltűnjenek a labdák az képfrissítő eljárásban újra ki kell rajzoltatnod a teljes játékteret, tehát nem csak a labdákat hanem a hátteret is.
Az objektumok megsemmisítésére használhatod a FreeAndNil() eljárást:
mbRight:
    for i:=1 to labdadb-1 do  FreeAndNil(labdatomb[i]);
... és ne felejtsd el alapra állítani a labdadb értékét.
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
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 16 10:54 #1719

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Hogyan kell megsemmisíteni a létrehozott objektumo(ka)t? Most úgy csinálom, hogy egy tömbbe mentem az objektumazonosítót, majd ha nem kell, akkor a nil értéket adom neki - de valamiért nem jó, mert jobb egérkattintásra még mindig mutatja a labdákat, holott erre kéne eltűnnie az összesnek. Ha odaírom, hogy destroy vagy free, az sem jó neki. Itt a teljes kód:
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls;
 
type
 
  { TFoAblak }
 
  TFoAblak = class(TForm)
    KepFrissito: TTimer;
    //procedure FormClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure KepFrissitoTimer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
type TLabda=class(TObject)
  var xhely,yhely: integer;
  kepe: TBitmap;
  private
  public
    constructor letrehoz(xhelyitt,yhelyitt: integer; kepeitt: Tbitmap);
end;
 
var
  FoAblak: TFoAblak;
  labdakep: Tbitmap;
  egylabda: TLabda;
  labdadb: integer;
  labdatomb: array [1..100] of TLabda;
 
implementation
 
{$R *.lfm}
constructor TLabda.letrehoz(xhelyitt,yhelyitt: integer; kepeitt: Tbitmap);
begin
        xhely:=xhelyitt;
        yhely:=yhelyitt;
        kepe:=kepeitt;
end;
 
{ TFoAblak }
 
{procedure TFoAblak.FormClick(Sender: TObject);
var egerhely: TPoint;
begin
      egerhely:=FoAblak.ScreenToClient(mouse.cursorpos);
      egylabda:=TLabda.letrehoz(egerhely.x,egerhely.y,labdakep);
      FoAblak.Canvas.Draw(egylabda.xhely,egylabda.yhely,egylabda.kepe);
end;  }
 
procedure TFoAblak.FormCreate(Sender: TObject);
begin
  labdakep:=TBitmap.Create;
  labdakep.LoadFromFile('labdabmp.bmp');
  labdadb:=1;
end;
 
procedure TFoAblak.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var i: integer;
begin
        case button of
          mbLeft:
        begin
          egylabda:=TLabda.letrehoz(x,y,labdakep);
          //FoAblak.Canvas.Draw(egylabda.xhely,egylabda.yhely,egylabda.kepe);
          labdatomb[labdadb]:=egylabda;
          inc(labdadb);
        end;
        mbRight:
        begin
             for i:=1 to labdadb-1 do
             begin
               labdatomb[i]:=nil;
             end;
             //labdadb:=1;
        end;
        end;
end;
 
procedure TFoAblak.KepFrissitoTimer(Sender: TObject);
var i: integer;
begin
for i:=1 to labdadb-1 do
begin
     if labdatomb[i]<>nil then
               FoAblak.Canvas.Draw(labdatomb[i].xhely,labdatomb[i].yhely,labdatomb[i].kepe);
end;
KepFrissito.Interval:=10;
end;
 
end.
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 14 16:17 #1711

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Huhhh, végre sikerült! Köszönöm az újabb segítséget! :cheer:
Így sikerült megoldani:
procedure TFoAblak.FormClick(Sender: TObject);
var egerhely: TPoint;
begin
      egerhely:=FoAblak.ScreenToClient(mouse.cursorpos);
      egylabda:=TLabda.letrehoz(egerhely.x,egerhely.y,labdakep);
      FoAblak.Canvas.Draw(egylabda.xhely,egylabda.yhely,egylabda.kepe);
end;
Az az érdekes, hogy az egerhely változó közbeiktatása nélkül, tehát így:
egylabda:=TLabda.letrehoz(mouse.cursorpos.x,mouse.cursorpos.y,labdakep);
nem működött. Pedig mindenhol így olvastam, és nem tértek ki arra a kiegészítésre, amit írtál.
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 14 16:03 #1710

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
A CursorPos így érhető el: Mouse .CursosPos
Ez azonban az egérmutató képernyőn elfoglalt helyét tartalmazza, ezért át kell alakítanod az ablakhoz viszonyított koordinátára, pl így: Form1. ScreenToClient (Mouse.CursorPos);

A Mouse.CursorPos mindig az egérmutató pillanatnyi helyét tartalmazza, és nem a kattintás helyét. Az onClick esemény kezelője akkor kerül futtatásra ha a lenyomás és a felengedés is ugyanazon elem területén, de nem feltétlenül ugyanazon a ponton történik. A két esemény között (lenyomás és felengedés) az egérmutató ideiglenesen el is hagyhatja az elem területét, mint tudjuk.
Javaslom, hogy ez esetben az OnMouseDown eseménykezelőt használd
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
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 14 15:19 #1709

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Igen, a labda fájlneve bizonyult rossznak; köszönöm az észrevételedet. Nálad egyébként rendesen létrejön egérkattintás helyein a labda? Mert nekem csak akkor jelenik meg, ha konkrét számokat írok be a létrehozáshoz, dehát ekkor nem az egérmutatóhoz, hanem az adott koordinátákra.
Ha nem adom meg a mouse unit-ot, akkor nem csinál semmit a program (elindul, de hiába kattintgatok, labdák sehol), míg ha megadom, akkor ezek a hibaüzenetek jelennek meg:
Projekt fordítása, Cél: kepfutidoben.exe: Kilépési kód: 1, Hibák: 2
unit1.pas(50,39) Error: Identifier not found "Cursorpos"
unit1.pas(50,57) Error: Identifier not found "CursorPos"

Tehát nem ismeri a CursorPos nevű azonosítókat - de miért nem? :S
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 14 10:54 #1708

  • JohnnyK
  • JohnnyK profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 78
  • Köszönetek: 16
A programkódod nálam működik. Akkor sikerült a hibaüzenetet előidéznem, amikor elgépeltem a bmp fájl nevét, vagy nem volt az exe futtatható állománnyal egy könyvtárban.
Szerencsésebb lehet esetleg teljes útvonalakat használni, pl 'c:\valami\ballbmp.bmp', vagy használni az exe mindenkori útvonalát pl SysToUTF8(ExtractFilePath(Application.ExeName)) + 'ballbmp.bmp', noha e nélkül is működik nálam jelen esetben.
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 13 13:27 #1707

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Most javítottam a programkódon; el is indulna, de már azt írja ki, hogy:
Unable to open file "ballbmp.bmp".
Press OK to ignore and risk data corruption.
Press Cancel to kill the program.

Ilyesmit írt ki, amikor .png volt a labda képformátuma, és most, .bmp-be átkonvertáltan is így kekeckedik. Mi lehet a baja?
Itt az egész kód a labdák megjelenítésére az egérkattintás helyére:
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;
 
type
 
  { TFoAblak }
 
  TFoAblak = class(TForm)
    procedure FormClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
type TLabda=class(TObject)
  var xhely,yhely: integer;
  kepe: TBitmap;
  private
  public
    constructor letrehoz(xhelyitt,yhelyitt: integer; kepeitt: Tbitmap);
end;
 
var
  FoAblak: TFoAblak;
  labdakep: TBitmap;
  egylabda: TLabda;
 
implementation
 
{$R *.lfm}
constructor TLabda.letrehoz(xhelyitt,yhelyitt: integer; kepeitt: Tbitmap);
begin
        xhely:=xhelyitt;
        yhely:=yhelyitt;
        kepe:=kepeitt;
end;
//end;
 
{ TFoAblak }
 
procedure TFoAblak.FormClick(Sender: TObject);
begin
      egylabda:=TLabda.letrehoz(mouse.cursorpos.x,mouse.cursorpos.y,labdakep);
      FoAblak.Canvas.Draw(egylabda.xhely,egylabda.yhely,egylabda.kepe);
end;
 
procedure TFoAblak.FormCreate(Sender: TObject);
begin
  labdakep:=TBitmap.Create;
  labdakep.LoadFromFile('ballbmp.bmp');
end;
 
end.
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 10 13:39 #1705

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Köszi; tegnap egyébként letöltöttem a YouTube-on keresztül egy Lazarus példajátékot: egy orosz illető készítette, valami 1945-klón lenne, "Szamolet" néven. Átnézve a kódját elég sokmindent ki tudok belőle puskázni remélhetőleg. :whistle:
Ami az OOP-t illeti, azt tudom róla, hogy ellentétben a régebbi programozási nyelvek felfogásával, itt az események váltják ki a cselekvéseket és az egyes objektumok maguk gondoskodnak magukról, változóik, adataik kezeléséről, és nem mindig az egész kód pörög folyamatosan (bár lehet, nem jól fogalmazok :silly: ).
Ennek Lazarusos alkalmazásánál azt nem tudtam, hogy képek futásidejű betöltése és egy objektumhoz hozzárendelése milyen kódolást igényel és hogy mely részei milyen típusúak (pl. a képet tároló változó, aztán meg a LoadFromFile hova tölti és az is milyen típusú, stb.). Szóval volt kavarodás rendesen és még most sem tiszta minden, de bízom ebben a szerzeményben. :)
Kiegészítés: valami megint rossz;ez a kódom:
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, mouse;
 
type
 
  { TFoAblak }
 
  TFoAblak = class(TForm)
    procedure FormClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
type TLabda=class(TObject)
  private
    xhely,yhely: integer;
    kepe: TBitmap;
  public
    constructor letrehoz(xhely0,yhely0: integer; kepe0: Tbitmap);
end;
 
var
  FoAblak: TFoAblak;
  labdakep: TBitmap;
  egylabda: TLabda;
 
implementation
 
{$R *.lfm}
constructor TLabda.letrehoz(xhely0,yhely0: integer; kepe0: Tbitmap);
begin
        xhely:=xhely0;
        yhely:=yhely0;
        kepe:=kepe0;
end;
//end;
 
{ TFoAblak }
 
procedure TFoAblak.FormClick(Sender: TObject);
begin
      egylabda:=Tlabda.letrehoz(getmousex,getmousey,labdakep);
      FoAblak.Canvas.Draw(egylabda.xhely,egylabda.yhely,egylabda.kepe);
end;
 
procedure TFoAblak.FormCreate(Sender: TObject);
begin
  labdakep:=TBitmap.Create;
  labdakep.LoadFromFile('labdabmp.bmp');
end;
 
end.
és most az a hibaüzenet egérkattintás után (merthogy a program elindulni sikeresen elindul):
External (azaz: külső) SIGSEGV osztályú kivételt okozott a 77BFD174 címen. :S
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 09 10:59 #1692

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
A TImage a TCustomImage lezármazottja, melynek van Picture néven TPicture típusú/osztályú tulajdonsága (property). Tehát ahová TImage kell oda a TImage típusú változót adod meg, ahová pedig TPicture oda a TImage típusú változó Picture nevű (TPicture típusú) elemét. Illetve ha TGraphic típusra van szükség oda mehet a Picture tulajdonság Graphic eleme (vagy szükség szerint a Bitmap, Icon, Jpeg, Pixmap, PNG, PNM mivel ezek mind a TGraphic leszámazottai).

Error: Incompatible type for arg no. 1: Got "TImage", expected "TPicture"
Hint: Found declaration: TCustomImage.SetPicture(const TPicture);

kep.SetPicture(masikkep.Picture);

Error: Incompatible type for arg no. 3: Got "TPicture", expected "TGraphic"
Hint: Found declaration: TCanvas.Draw(LongInt,LongInt,TGraphic);

valami.Canvas.Draw(0,0,masikkep.Picture.Graphic);

Ha megnézed a súgót vagy a használt unitok forráskódját akkor megtalálhatod a választ az ezekhez hasonló problémákra. A forráskódszerkesztőben jobb egérgombbal kattintva egy azonosítóra a "Delaráció megkeresése" lehetőség is elérhető.

Mielőtt elmegy a kedved ismerkedj meg az objektum központú programozás (OOP - Object Oriented Programming) alapjaival és az osztályok egymásba/egymásra épülésének mikéntjével is. Ezek nélkül újabb és újabb olyan problémákba ütközöl majd, melyek valójában nem azok. A világháló tele van OOP cikkekkel, nem kevés ObjectPascal témájú is akad, pl. egyik fórumtársunk (dfeher) fordításában: Objektum-orientált programozás Free Pascal-lal és Lazarus-szal
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
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 09 09:49 #1691

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
A hibaüzeneteket nagyjából értem, csak az nem világos, hogy a TGraphic, a TPicture és a TImage hogyan épülnek egymásra, azaz ezek közül milyen típust kell megadni a képváltozó deklarálásakor, a kép létrehozásakor, a felhasználásakor...
Enélkül csak sötétben tapogatózok, mert a különböző próbálkozásaimra különböző hibaüzeneteket kapok (pl. egyik helyre a hibaüzenet alapján TPicture-t adok meg, akkor máshonnan a TImage típus fog az elvárt és hiányolt lenni, stb.).
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 09 07:53 #1688

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
A hibaüzenetek után tippeket (hint) is kapsz, melyek segítenek a hiba pontos okának felderítésében.

Error: Incompatible type for arg no. 1: Got "TImage", expected "TPicture"
Hint: Found declaration: TCustomImage.SetPicture(const TPicture);

Hiba: Nem megfelelő típus az 1. argumentumban: Megadva "TImage", szükséges "TPicture"
Tipp: Talált deklaráció: TCustomImage.SetPicture(const TPicture);

Az ilyen üzenetek azt jelentik, hogy az általad paraméterként átadni szándékozott változó típusa nem egyezik meg azzal amit az adott eljárás/függvény a deklarációja szerint fel tud dolgozni.

Error: identifier idents no member "LoadFromFile"

Hiba: az azonosító nem nevez meg tagot: "LoadFromFile"
Ez azt jelenti hogy az adott osztály/rekord nem rendelkezik az adott nevű taggal: mezővel, tulajdonsággal vagy metódussal.

A súgóban részletes információkat találhatsz egy-egy elemmel kapcsolatban ha a beszúrási jelet egy érvényes azonosítóra viszed és lenyomod az F1 gombot. A súgó hálózaton elérhető (aktuális) változata a "Súgó / Online súgó" menüpontra kattintva érhető el, a helyi chm változat pedig a "Súgó / Súgó" által (ha telepítve van).
E mellet az "Eszközök / Példa projektek" menüpontban is sok hasznos dologra, melyek segítenek megismerni a lehetőséget és megérteni azok használatának mikéntjét.
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
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 08 18:30 #1685

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Köszönöm, a háttér most már megfelelő nagyságban rajzolódik ki.
De ami nem megy még, az a kép kirajzolása futásidőben, ugyanis ilyen hibaüzeneteket kapok:
Projekt fordítása, Cél: spdef.exe: Kilépési kód: 1, Hibák: 3, Tippek: 2
unit1.pas(63,32) Error: Incompatible type for arg no. 1: Got "TImage", expected "TPicture"
customimage.inc(69,24) Hint: Found declaration: TCustomImage.SetPicture(const TPicture);
unit1.pas(68,56) Error: Incompatible type for arg no. 3: Got "TPicture", expected "TGraphic"
canvas.inc(20,19) Hint: Found declaration: TCanvas.Draw(LongInt,LongInt,TGraphic);
unit1.pas(79,13) Error: identifier idents no member "LoadFromFile"

És így próbálok képet beolvasni, illetve hozzárendelni egy objektumhoz:
1. A FoAblak FormCreate-jében:
jatlovkep:=TImage.Create(FoAblak);
jatlovkep.LoadFromFile('kepek\lovedek.bmp');

2. A lövés eseményben:
var jatlov: TImage;
...
if (jatekoslo=true) and (jatlohet=true) then
begin
jatlov:=TImage.create(FoAblak);
jatlov.picture:=jatlovkep;
jatlov.width:=5;
jatlov.height:=10;
jatlov.Top:=Jatekos.Top-8;
jatlov.Left:=Jatekos.Left+Jatekos.Width div 2;
canvas.draw(jatlov.Left,jatlov.top,jatlov.picture);
end;

Plusz még az egész Unit1 implementation része előtt megadtam: var jatlovkep: TImage;
Már bő 2 órája bújom a netet, de nem találtam megoldást vagy példaprogramot, ami megválaszolná a kérdésemet... :angry:
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 08 10:30 #1678

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
Az ablak kirajzolását szükség esetén a TForm.Paint metódus meghívásával kényszerítheted, ekkor fut a TForm.FormPaint eseménykezelő. Itt is rajzolhatsz, de ahogy lassan összeállnak a részletek inkább azt javaslom kezd elölről és e programban ne legyen saját TForm.FormPaint metódusod.

A játéktér, így a háttér, a labdák, a lövedék és a többiek kirajzolását is időzített eljárásban csináld. Amit szeretnél megjeleníteni az ablakban azt a TForm.Canvas-ra kell rajzolnod (megfelelő sorrendben: háttér először). A játéktér pillanatnyi állapotának kirajzolása után kell hívnod a TForm.Paint metódust hogy az egész megjelenjen a képernyőn.

Tomi írta:

terulet := TRect.Create(0, 0, FoAblak.Width, FoAblak.Height);
Canvas.StretchDraw(terulet, hatterkep);

Nem írtad milyen "hibát ír ki"... Hiba esetén mindig írd meg a hibaüzenetet is! Különben jó eséllyel nem tudnak segíteni akiktől ezt várod.
Ez esetben azonban biztosra veszem, hogy ez volt a hibaüzenet: identifier idents no member "Create"
Ennek az az oka, hogy a TRect nem class (osztály), hanem record aminek nincs se Create nevű mezője se metódusa. Ez utóbbi nem is lehet neki.

Így csináld:
terulet := Rect(0, 0, Width, Height);
Canvas.StretchDraw(terulet, hatterkep);
vagy még rövidebbre véve a forráskódot, inkább így:
Canvas.StretchDraw(Rect(0, 0, Width, Height), hatterkep);

... és még valami fontos: a képeket (háttér, labda, lövedék stb.) ne akkor töltsd be amikor kirajzolod, hanem a program indításakor (Pl. Form.OnCreate eseménykezelőben), különben feleslegesen terheled a gépet.
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
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 08 09:14 #1677

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

Gábor írta: Kirajzoláskor (ezt amúgy is időzítővel kell/illik megoldani LCL és SDL esetén is)

  • A labda új helyének kiszámítása az irányváltozó pillanatnyi értéke alapján
  • A játéktér szükséges elemeinek kirajzolása. (pl háttér és labda/labdák az új helyre)

  • A kirajzolása a dolgoknak az ablak FormPaint eseményében van?
    Jó, hogy szóbahoztad ezt a kirajzolásos dolgot, mert most éppen próbálkozom egy űrhajós-lövöldözős játékocska készítésével Lazarusban, és az a gondom, hogy nem tudom, hol, hogyan rajzoltassam ki a futásidőben létrehozott lövedékeket (és egyéb ilyen objektumokat).
    A lövedék betöltésére ezt a kódot használom, mikor lő a játékos:
    if (jatekoslo=true) and (jatlohet=true) then
      begin
          jatlov:=TImage.create(FoAblak);
          jatlov.picture.bitmap.LoadFromFile('kepek\lovedek.bmp');
          jatlov.width:=5;
          jatlov.height:=10;
          jatlov.Top:=Jatekos.Top-8;
          jatlov.Left:=Jatekos.Left+Jatekos.Width div 2;
      end;
    Hibát nem okoz, viszont a lövedék nem látható. Gondolom, még nem rajzolódik ki - de nem tudom, ezt hol kell megoldani, melyik eseménybe rakjam? És hasonló módon kell kirajzolni, mint egy hátteret, tehát canvas.draw(jatlov) vagy picture.draw(jatlov) ?
    Meg még az a gond, hogy a hátteret nem tudom az ablak teljes méretére kiterjesztetten kirajzoltatni, ugyanis erre a kóddarabra:
    ...
    terulet := TRect.Create(0, 0, FoAblak.Width, FoAblak.Height);
    Canvas.StretchDraw(terulet, hatterkep);

    ...
    hibát ír ki.
    Téma zárolva.

    Egy kezdő Lazarus használó kérdései 2015 dec. 08 08:25 #1676

    • Gábor
    • Gábor profilkép
    • Adminisztrátor
    • Adminisztrátor
    • Hozzászólások: 506
    • Köszönetek: 86
    A következőkre van szükség:
    1. Billentyűlenyomás elkapásakor (LCL-ben pl. TForm.OnKeyDown)
      • Irányváltozó beállítása a kívánt irányra
    2. Billentyűfelengedés elkapásakor (LCL-ben pl. TForm.OnKeyUp)
      • Irányváltozó beállítása, hogy azt jelentse "semerre"
    3. Kirajzoláskor (ezt időzítővel kell/illik megoldani LCL és SDL esetén is, LCL-ben pl. TTimer.OnTimer)
      • A labda új helyének kiszámítása az irányváltozó pillanatnyi értéke alapján
      • Szükség esetén a játéktér elemeinek kirajzolása. (pl háttér és labda/labdák az új helyre)

    + A Timer nem Delay(). A Timer (időzítő) adott időközönként futtat egy felhasználó által megírt eljárást, a Delay pedig 'felfüggeszti' a kód futását a paraméterben megadott ideig.
    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
    Téma zárolva.

    Egy kezdő Lazarus használó kérdései 2015 dec. 07 19:34 #1674

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

    Gábor írta: Mihez kell a változók értékét "ciklusosan" ellenőrizni? Mire használnád az értékeket ilyenkor?


    Arra, hogy elmozdulhatnak-e a labdaobjektumok. Vagy ez a TTimer ugyanaz lenne, mint a Delay a sima Pascalban?
    Téma zárolva.
    • Oldal:
    • 1
    • 2
    • 3