Lazarus 3.6 (2024.09.30.)
Letöltés

  • Oldal:
  • 1
  • 2
  • 3

TÉMA:

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

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 507
  • Köszönetek: 86
Mihez kell a változók értékét "ciklusosan" ellenőrizni? Mire használnád az értékeket ilyenkor?
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 14:59 #1670

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

Gábor írta: Ha "folyamatosan" ellenőrizni akarod a változók értékét akkor szerinted azok "folyamatosan" változhatnak. A változást azonban csak valamilyen esemény okozhatja.
Az egyik kérdés tehát az, hogy hol és mitől változnának az értékek... a másik pedig, hogy mire használod és hol van ténylegesen szükség a változók értékére...


Az a helyzet, hogy készítettem egy kis mintaprogramocskát, amelyben a felhasználó(k) egyidejűleg két labdát is tud(nak) irányítani, tehát az alkalmazás képes egynél több billentyű egyidejű kezelésére. Ez már régi problémám volt Turbo Pascalban is, és úgy néz ki, Lazarusban sikerült megoldanom. Dióhéjban a felépítése annyi, hogy vannak a 4 mozgásirányhoz rendelt logikai változók (a 2 labdánál összesen 8), amelyek az adott gomb lenyomásakor IGAZ értékűek lesznek és a gomb felengedéséig azok is maradnak, utána pedig HAMIS értékűek lesznek. Ez eddig teljesen eseményvezérelten megoldható. Viszont a változók kiértékelése ciklusosan kéne, hogy legyen, és erre egyelőre a TTimer eseményt találtam (próbáltam ezeket az IF-eket beszúrni a program elejére vagy végére a használt függvények elé vagy mögé, de úgy nem működött; mindig hibát írt ki.). Ez a legjobb megoldás vagy van ilyenre külön esemény a Lazarusban?
Egyébként ezt a programomat majd közzétenném majd itt a honlapon a Letöltőközpontban, ha lehet, hiszen hátha szolgálhat másoknak is segítség gyanánt.

Gábor írta: ?!
Ugye nem egy vagy több a FreePascal/Lazarus unit-jaiban már deklarált változót akarsz újra deklarálni?


Nem, csupán néhány saját boolean (logikai) változóról van szó (labda1fel, labd1le, stb.), amelyek igaz vagy hamis voltát talán lehetne az Időzítő (TTimer) eseményen kívül is valahogy folyamatosan ellenőrizni.
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 06 18:58 #1662

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 507
  • Köszönetek: 86
Ha "folyamatosan" ellenőrizni akarod a változók értékét akkor szerinted azok "folyamatosan" változhatnak. A változást azonban csak valamilyen esemény okozhatja.
Az egyik kérdés tehát az, hogy hol és mitől változnának az értékek... a másik pedig, hogy mire használod és hol van ténylegesen szükség a változók értékére...

Tomi írta: Mert most akárhová raktam (implementation elé, mögé vagy akár az interface-hoz), mindenütt volt valami baja: hol a BEGIN-t hiányolta, hol "duplicate identifier"-t ír ki a változók nevére, hol "identifier not found"-ot... :unsure:
(RÉSZBEN MEGOLDOTTAM! (Elfelejtettem az OnCreate-be rakni a változók inicializálását!)

?!
Ugye nem egy vagy több a FreePascal/Lazarus unit-jaiban már deklarált változót akarsz újra deklarálni?
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. 06 16:10 #1660

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Még egy fontos megoldandó kérdés bukkant fel: ha valami olyan kódot akarok elhelyezni, amelyet semmi más felsorolt eseménybe (se kattintás, se gombnyomás, stb.) nem tudok beilleszteni, mert nem illik oda eseményileg, akkor azt hová tegyem, hová tehetem a forráskódszerkesztőben?
Néhány logikai (boolean) változó értéket szeretném leellenőrizni a program futása során folyamatosan és ehhez kellene valami ciklusos esemény. Mert most akárhová raktam (implementation elé, mögé vagy akár az interface-hoz), mindenütt volt valami baja: hol a BEGIN-t hiányolta, hol "duplicate identifier"-t ír ki a változók nevére, hol "identifier not found"-ot... :unsure:
(RÉSZBEN MEGOLDOTTAM! (Elfelejtettem az OnCreate-be rakni a változók inicializálását!) DE: kérdéses még számomra, hogy lehet-e és ha igen, akkor hogyan ciklusosan leellenőrizni valami(ke)t, a TTimer objektum használatán kívül?)
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 06 10:51 #1657

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Köszönöm szépen a hasznos útmutatást, mely alapján végre sikerült zöldágra vergődnöm vele; most már csak át kell ültetnem egy konkrét programba, de ez remélhetőleg már menni fog.
Nem volt könnyű rávenni a Lazarust, hogy halmazból kiírassam az elemeket, de azért megoldottam. Ehhez persze kellett a segítséged is, mert még eléggé kezdő vagyok sokmindenben.
Van nekem egy Lazarus-jegyzetem is (Kálcza Tamás és Nagy Balázs írták), de az csak a felület bemutatására szorítkozik, magára a nyelv ismeretére és használatára nem - igaz, ez nem is várható el egy jegyzettől, hiszen ahhoz egy könyv is kevés lenne.
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 05 19:37 #1656

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 507
  • Köszönetek: 86
Az interface (felület) részben deklarált változók a unit-ot használó más unitok és programok által is elérhetők, az implementation (kidolgozás) részben deklaráltak csak az adott unitban, a deklarációt követő kódrészekben hozzáférhető. Az hogy "jó helyen vannak-e" csak attól függ mi a célod velük...

A Pascal/ObjectPascal nyelv alapvető részei a megvalósítástól függetlenül szinte teljesen ugyanazok. Segítségként ajánlom szíves figyelmedbe a következő dokumentációs oldalakat:

Free Pascal 3.0.0 Documentation
RTL, FCL, LCL Dokumentation

... és Google a barátod!
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. 05 18:13 #1654

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Köszi a gyors segítségért. Amúgy a változókat jó helyre írtam? Úgy értem az implementation rész után kell ezeket a globális változókat tenni, amik nem az alprogramokéi?
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 05 17:50 #1653

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 507
  • Köszönetek: 86
Először is a "gombok" változó nincs deklarálva (megjegyzésben van).
Másodszor az "in" csak "set" típusú változókon alkalmazható, melyek tartalmai karakterláncok nem, csak ordinal (egész szám) típusúak lehetnek. Amikor az IntToStr függvényt használod karakterláncot hozol létre és azt próbálod keresni a készletben (set).

Tomi írta: if (inttostr(key) not in gombok) then

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. 05 15:24 #1651

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
És ezzel a kódommal mi lehet a baj? Azt szeretném vele csinálni, hogy a lenyomott billentyűk kódjait mentse el egy halmazba, ugyanakkor törölje onnan a felengedettek kódjait. Tehát maradjon benne, míg fel nem engedjük az adott gombot. Íme a kód:
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { TFoAblak }
 
  TFoAblak = class(TForm)
    Kiiro: TStaticText;
    Gombkiiro: TStaticText;
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  FoAblak: TFoAblak;
 
implementation
 
{$R *.lfm}
 {var gombok: set of char;
   gombhalmdb: byte;
 
 gombok:=[];
 gombhalmdb:=0;
 
 gombkiiro.caption:='';}
{ TFoAblak }
 
procedure TFoAblak.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var gkszov: string;
    i: byte;
begin
  Kiiro.caption:='Lenyomva: '+inttostr(key);
  if (inttostr(key) not in gombok) then
  begin
    include(gombok,inttostr(key));
    inc(gombhalmdb);
    for i:=0 to gombhalmdb do
        Gombkiiro.Caption:=Gombkiiro.Caption+gombok[i]+',';
  end;
end;
 
 
procedure TFoAblak.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState
  );
var gkszov: string;
    i: byte;
begin
  Kiiro.caption:='Felengedve: '+inttostr(key);
  if (inttostr(key) in gombok) then
  begin
    exclude(gombok,inttostr(key));
    dec(gombhalmdb);
    if (gombhalmdb>0) then
    begin
      for i:=0 to gombhalmdb do
        Gombkiiro.Caption:=Gombkiiro.Caption+gombok[i]+',';
    end;
  end;
end;
 
end.
A 46. sornál (if (inttostr(key) not in gombok) then ) nem tetszik neki valami, mert azt a hibaüzenetet kapom, hogy: ")" expected but "not" found .
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 04 15:53 #1646

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Köszönöm ezeket az infókat is; az imént néztem el az ajánlott SDL-es honlapra és nagyon biztatónak tűnik.
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 03 20:35 #1636

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 507
  • Köszönetek: 86
Ilyen játékok készítéséhez inkább a Simple DirectMedia Layer (röviden SDL) használatát javaslom az ablakos alkalmazásokhoz tervezett grafikus felület helyett.
A pascal unit-ok és példák megtalálhatók a Free Pascal könyvtáraiban. További hasznos információkat találhatsz a Free Pascal wiki "FPC and SDL" című írásában és a " Free Pascal meets SDL " oldalon.
A szükséges binárisokat (windows-on sdl*.dll fájlokat) a libsdl.org -ról lehet beszerezni, Unix/Linux rendszereken általában előre telepítve vannak (sdl*.so).
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. 03 15:59 #1635

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Szia, Gábor!
Köszönöm az alapos válaszodat; kipróbáltam és most már jól működik :laugh: (Ez az OnPaint valami ciklikusan ismétlődő rajzolóesemény-féle lenne, ami alatt folyamatosan frissül az ablak tartalma?)
Még egy kérdés hirtelenjében: tudsz/tudtok valami megoldást arra, hogy egyszerre tudjon két játékos billentyűzettel mozgatni két objektumot a játékban? Mert ott van ugyan az esemény a Lazarusban a gomblenyomásra és felengedésre, de nem tudom azt megcsinálni, hogy egyszerre képes legyen a program kezelni két különböző gombot. Úgy néz ki az egész, hogy van két labda a játék ablakában, és egyik felhasználó a nyíl gombokkal, másik a WASD gombokkal tudja irányítani a saját labdaobjektumát - de csak akkor, ha a másik játékos éppen nem nyom le semmilyen gombot. De úgy lenne jó, ha egyszerre tudnák. Megoldható ez alapvető Lazarus utasításokkal, vagy esetleg valami Assembly-kód is kellene hozzá, mert olyan alacsony szinten megy csak?
Téma zárolva.

Egy kezdő Lazarus használó kérdései 2015 dec. 03 12:49 #1631

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 507
  • Köszönetek: 86
A Lazarus menüjében találsz egy eszközt, amely a Lazarus telepítésével együtt a gépeden elhelyezett példaprogramokat és bemutatókat sorolja fel: "Eszközök / Példa projektek ..."

Tehát a program hibátlanul elindul, csak éppen nem látszik semmi háttérképe az ablaknak.

A kép kirajzolását az .OnPaint eseménykezelőbe tedd!
A kép a te kódoddal is ki van (illetve volt) rajzolva az ablakban annak létrehozásakor, de amikor a program futása közben (a OnCreate után) eljön a megfelelő idő a rajzolásra a programod teszi a dolgát (megfelelően) és megrajzolja a saját hátterét, így felülírva az általad korábban (rosszkor) kirajzolt képet.

milyen utasítások használhatók a Lazarusban? A Pascalé vagy a Delphié?

A Lazarus egy fejlesztőkörnyezet, mely elsősorban a FreePascal-hoz készült., így annak minden képessége kihasználható. Ezt egészítik ki a grafikus felületek fejlesztése esetén szükséges dolgokkal (GUI komponensek). A Pascal és ObjectPascal több dialektusában írhatsz programokat (TP,FPC,OBJFPC,DELPHI,GPC, és a többi), melyek mindegyikével használható az összes telepített unit és komponens, melyek a legkülönbözőbb témákban lehetnek a fejlesztők hasznára. Természetesen minden attól függ, hogy hol és mire akarod használni a végeredményt. Mivel a Free Pascal és a Lazarus is úgy van tervezve, hogy a legkülönbözőbb rendszereken is lehetőleg ugyanazt az eredményt adja a végfelhasználók számára, ezért az alapvető dolgok szintjén teljesen megegyezőnek veheted a csak DOS/Windows környezetben működő hasonló szoftverekkel. Bizonyos speciális esetekben lehetnek eltérések.
Az ismerkedéshez elkezdéséhez ajánlom a FreePascal/Lazarus wiki magyar nyelvű Dokumentáció és GY.I.K oldalát.

ITT nézegetem éppen a graphics unit függvényeit, de nem találom a Draw vagy PutPixel, illetve megfelelőiket.

Nem jó helyen nézed, A Graphics és a Graph unit nem ugyanaz (Delphi-ben sem). Amit nézni szeretnél az a Graph unitban is megtalálható, de ablakos alkalmazásokhoz komponensek .Canvas elemének leírásaiban találsz infókat. A saját példádban is használtad a Canvas.Draw-ot...

megpróbáljak képpontokat kirajzolni az egérgombnyomás helyére, de nem sikerült, valami hiba történt

Egy képpont az egér lenyomás helyére az OnMouseDown eseménykezelőben is tehető értéket adva az adott képpontnak: Canvas.Pixels[X,Y]. Az egér mozgását követő vonal rajzolásához az OnMouseDown, OnMouseMove és az OnMouseUp használata szükséges.

Fontos: A Lazarus-ban van beépített súgó, mely az F1 lenyomásával vagy a menüből érhető el. Egy azonosítóra állítva a beszúrási jelet (karet) az adott elemhez tartozó információk jelennek meg.
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. 03 10:19 #1629

  • Tomi
  • Tomi profilkép Témaindító
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 82
  • Köszönetek: 1
Sziasztok!
Én perpillanat egy teljesen kezdő Lazarus felhasználó vagyok, aki annakidején a jó öreg DOS-os Turbo Pascal 7-tel kezdte a programozással való ismerkedést. A Lazarusra nemrég találtam rá, és elég jónak találom, bár szokatlan még nekem a felülete és használata, mivel eddig olyan fejlesztőeszközöket használtam, amelyeknél egy üres szerkesztőablakba kellett az egész kódot begépelni.
Mint eddig is a többivel, a Lazarussal is elsősorban játékprogramokat szeretnék készíteni. Első próbálkozásom vele az volt, hogy egy pattogó labdát kellett a játékosnak egérkattintással eltalálni, tehát kb. ilyen szinten vagyok vele. Közben persze bújom a világhálót leírások és példaprogramok után kutatva, de még így is vannak olyan dolgok, amelyek nem világosak számomra, ezért is örülök, hogy rátaláltam erre a magyar nyelvű fórumra. :)
Hogy a közepébe vágjak, nem tudom, hogy a következő kódommal mi lehet a baj, mert nem jeleníti meg az ablakban a háttérképet (természetesen az OnCreate esemény tartalmazza):
procedure TFoAblak.FormCreate(Sender: TObject);
var kep: tbitmap;
begin
  kep := TBitmap.Create;
  kep.LoadFromFile('e:\kepem.bmp');
  Canvas.Draw(0, 0, kep);
  kep.Free;
end;
Tehát a program hibátlanul elindul, csak éppen nem látszik semmi háttérképe az ablaknak.
A másik kérdésem az lenne, hogy tkp. milyen utasítások használhatók a Lazarusban? A Pascalé vagy a Delphié? Tudom, rokon nyelvek, de azért lehetnek bizonyos különbségek, mert próbáltam a TP-ból átvenni a PutPixel() utasítást bele, hogy megpróbáljak képpontokat kirajzolni az egérgombnyomás helyére, de nem sikerült, valami hiba történt.
( ITT nézegetem éppen a graphics unit függvényeit, de nem találom a Draw vagy PutPixel, illetve megfelelőiket.)
Elnézést, ha kicsit sokat írtam, úgyhogy zárom is most soraimat. Bizonyára lesznek még kérdéseim, és azokhoz illetve a fentiekhez előre is köszönöm a segítő válaszaitokat.
Téma zárolva.
  • Oldal:
  • 1
  • 2
  • 3