Keresés

Részletes keresés

smile64 Creative Commons License 2011.10.20 0 0 8757

Jesszumpepi...

A lazres.exe egy program. Nem szövegfájlba kell írni a nevét, hanem futtatni kell.

Nyitsz egy parancssorablakot. Tudod, Start menu, minden program, kellékek, parancssor. Előjön egy csúnya, fekete ablak. Van benne valami ilyesmi, hogy c:\>, meg ott villog a kurzor, meg ilyenek. Oda beleírod, hogy cd \lazarus\tools, megnyomod az entert. Aztán beleírod azt is, hogy lazres valami.lrs valamikep.bmp, aztán megint megnyomod az entert. Vagy valahogy így. Erre biztos csinálni fog egy enyemfile.lrs-t, ha el nem rontottál valamit. Mármint ha a valamikep.bmp ott van a lazres.exe mellett, mert ha nem, akkor a teljes útvonalát oda kell írni.

 

Előzmény: Ismeretlen Személy :) (8756)
Ismeretlen Személy :) Creative Commons License 2011.10.20 0 0 8756

Köszönöm, hogy ennyi energiát fektetsz bele, hogy tudjál nekem válaszolni.:-)

De sajnos nekem így se jó. Leírom, hogy csinálom:

1. Új szöveges fájlba beírom: lazres valami.lrs kep1.bmp ... kepN.bmp

2. Elmentem valami.lrs néven, abba a mappába, ahol az exe fájl található

3. A program uses részébe beírom az LResources unitot

4. Egy tetszőleges eseménybe az alábbi program részt:

   Procedure ....

   var image:Timage;

   begin

    Image:=TImage.create(self);

    Image.Picture.Bitmap.LoadFromResources('kep1');

    ...

  end;

5. Initialization részbe {$I valami.lrs}

 

És amikor elindítom ezt írja: Identifier not found "lazres", és a piros hiba csíkot a valami.lrs fájl első sorára küldi, mivel ott a hiba.

Előzmény: smile64 (8755)
smile64 Creative Commons License 2011.10.20 0 0 8755

Jól felpiszkáltál, úgyhogy letöltöttem a Lazarust, és kipróbáltam. Nekem működik.

Egy dolog maradt ki a lenti leírásból: be kell tenni a uses-be az LResources unitot. Ha netán azt a hibaüzenetet kaptad fordításkor, hogy Identifier not found "LazarusResources", annak ez az oka.

Egyebet nem tudok mondani, kérem kapcsolja ki.

Előzmény: Ismeretlen Személy :) (8754)
Ismeretlen Személy :) Creative Commons License 2011.10.20 0 0 8754

Így se jó.

smile64 Creative Commons License 2011.10.18 0 0 8753

Minden unitnak van, csak nem kötelező.

 

Úgymint:

 

unit akarmi;

 

interface

 

//mindenféle dolgok

 

implementation

 

//mindenféle dolgok

 

initialization

 

//mindenféle dolgok

 

finalization

 

//mindenféle dolgok

 

end.

 

Előzmény: Ismeretlen Személy :) (8752)
Ismeretlen Személy :) Creative Commons License 2011.10.18 0 0 8752

2. pontig én is megcsináltam. (Csak azt nem tudom, mire kell a Lazres.exe, azt nem írja, hogy társítanom kéne vele az erőforrás fájlt)

A 3. pontot is értettem, csak elakadtam, mert nem tudom, hogy a programban hol az initialization rész, ami lehet, hogy gáz.:-)

A 4. pontot is értettem, csak ugye a 3. pont nélkül mit sem ér.

Tehát minek ide angol tudás.:-)

 

De kösz, mert megakartam már kérdezni, hogy hol az initialization rész. Csak elfelejtettem. Szóval hol is van?

Előzmény: smile64 (8750)
Ismeretlen Személy :) Creative Commons License 2011.10.18 0 0 8751

Nekem is megvan a delphi 7, de nem szeretem, windows 2003-assak a gombjai, csúnya a windows 7-hez. Csak ezért használok Lazarust.:-) Amúgy Delphiben nekem is működik.

Részletessen leírom, hogy mit is akarok pontossan.

1.Van egy ComboBox, annyi kép lesz, amennyi, ahoz az itemhez tartozik.

2 pl.: ha a Box=Terep: x képet létrehoz, a megfelelő képeket beleilleszti (fű,föld,víz,beton stb.)

         ha a Box=Elemek: az előző x képet letörli, y képet létrehoz, a megfelelő képeket beleilleszti (fa,bokor,villanyoszlop,kerítés stb.)

 

Tudom megcsinálhatom, hogy az összeskép meg van már a program idításakor, és mindig a megfelelőt teszem láthatóvá, de szerintem az macerásabb.

Előzmény: attoparsec (8749)
smile64 Creative Commons License 2011.10.18 0 0 8750

Ez a cikk nem segít? http://wiki.lazarus.freepascal.org/Lazarus_Resources

 

Ja, persze, nem tudsz jól angolul... Akkor összefoglalom a tartalmát.

 

1. Megkeresed a c:\Lazarus\Tools könyvtárban a lazres nevű programot. Ha nincs exe, akkor a lazres.lpi-t kell először lefordítani.

2. Megcsinálod az erőforrásfájlt pl. így: lazres mylazres.lrs valamifile.bmp

3. Ezt a fájlt az initialization szekcióba kell belinkelni. {$I mylazres.lrs}

4. Felhasználás: Image.Picture.LoadFromLazarusResource('valamifile'); //.bmp nélkül kell megadni a nevet

 

Legalábbis a fenti cikkben ezt írják, nem próbáltam ki.

 

 

Előzmény: Ismeretlen Személy :) (8747)
attoparsec Creative Commons License 2011.10.18 0 0 8749

altalaban akkor van ertelme futasidoben letrehozni komponenst, ha nem tudod elore, hany darabra lesz szukseged.

ha a kepeket resourcebol olvasod, azt jelenti, hogy elore tudod, hany keped van => ennyi tImage kompenens kell, ha kispetya otleted hasznalod. vagy minden kephez hozz letre egy tImageList-et, amiben csak egyetlen kepet tarolsz.

persze igazad van, az igazi megoldas az lenne, ha sikerulne runtime betolteni kepet resourcefilebol.

delphiben mukodik, amit a multkor lirtam, lazarus eseten nem tudok segiteni.

 

 

 

Előzmény: Ismeretlen Személy :) (8747)
kisspetya Creative Commons License 2011.10.18 0 0 8748

Kifejthetnéd, hogy pontosan mit akarsz.
De ha már meglévő képet akarsz betölteni az exéből, akkor egyszerűbb, ha egy Image-ben elmented, aminek a visible-jét false-ra állítod. Így a user úgysem látja, amíg te nem akarod.

Előzmény: Ismeretlen Személy :) (8747)
Ismeretlen Személy :) Creative Commons License 2011.10.18 0 0 8747

Igen, ezt tudtam. Csak én futási időben hozom létre az image komponenst. Tudom lehetne így is Image1.Picture.Bitmap.LoadFromFile(File). De a resource fájból való betöltés praktikusabb lenne. Az ImageList meg nem jó, mert nem egyformák a képek méretei.

Előzmény: attoparsec (8746)
attoparsec Creative Commons License 2011.10.18 0 0 8746

lazarust sosem hasznaltam, de ha nagyon hasonlit a delphihez, akkor ott is valoszinuleg ugyanugy kell:

 

a form szerkesztoben rateszel egy tImage komponenst a formra, s ha rakattintasz a komponensre, a tulajdonsagai megjelennek egy ablakban (property editor - tulajdonsagszerkeszto). a delphiben ennek az ablaknak a neve "object inspector" .

az Image-nek van egy "Picture" tulajdonsaga; ha arra kattintasz, meg kene jelenjen egy dialogusablak, amiben kivalaszthatsz egy kep-fajlt.

ez azonnal lathato is lesz, de ami fontos, futas kozben is megmarad. a delphi a kivalasztott kepet a resource-fajlba menti es a program inditasakor onnan automatikusan be is olvassa es az Image komponens Picture tulajdonsagat erre allitja, igy ezzel mar nem kell torodj.

Előzmény: Ismeretlen Személy :) (8745)
Ismeretlen Személy :) Creative Commons License 2011.10.17 0 0 8745

Köszönöm, de sajnos nem jutottam előrébb.

Én is eddig így probáltam, bár én Lazarust használok nem Delphit. Olvastam, hogy az erőforrás fájloknál van valami eltérés, de angolul volt, ezért nem teljessen értettem. Ez a 'BMP' megoldás se jó.

 

"egyebkent: nem lenne eleg, ha design-time (a property editorban) betoltened a kepet az image-be ? akkor nem kellene azzal torodni, hogy futas kozben toltsd be."

 

Nem tudom ezt, hogy kell. Ha leírnád azt nagyon megköszönném.:-)

 

Előzmény: attoparsec (8743)
kisspetya Creative Commons License 2011.10.16 0 0 8744

próbáld így:

 

var Stream: TResourceStream;
...
Stream:=TResourceStream.Create(HInstance,'kep','BMP');
try
Image.Picture.Bitmap.LoadFromStream(Stream);
finally
Stream.Free;
end;

Előzmény: Ismeretlen Személy :) (8742)
attoparsec Creative Commons License 2011.10.16 0 0 8743

elvileg az RT_RCDATA helyett RT_BITMAP kellene:

 

stream:= tResourceStream.create(hInstance, 'kep',  RT_BITMAP);

 

kiprobaltan, es sajnos igy sem mukodik.

ha a resource tipus (RT_XXXX) nem jo, akkor a stream-be nem a megfelelo formatumban kerul az adat, ezert nem tudja a bitmap beolvasni magat a streambol, innen a hibauzenet.

gondolom, a delphi imageEditor-javal tetted a kepet a resourcefajlba. sajnos nem tudtam kideriteni, hogy milyen RT_XXXX kellene ide, hogy mukodjon.

 

egy mukodo megoldas a kovetkezo: keszits egy szovegfajlt pl 'kepek.rc' nevvel amiben legyen:

kep1  BMP "kep1.bmp"

kep2  BMP "kep2.bmp"

 

(a kep1,2.bmp nyilvan letezo bitmap fajlok a lemezen)

a delphi bin mappaban van egy brcc32.exe nevu command-line program.

azt inditsd el igy: c:delphibinbrcc32 kepek.rc // persze a c:delphi helyett ami eppen nalad aktualis

a brcc32 general egy kepek.res fajlt.

 

a programodba ird be a fo unitba (az implementation utan): {$R kepek.res}

 

stream:=  tResourceStream.create(hInstance, 'kep1',  'BMP');

 

nalam igy mukodik.

 

egyebkent: nem lenne eleg, ha design-time (a property editorban) betoltened a kepet az image-be ? akkor nem kellene azzal torodni, hogy futas kozben toltsd be.

 

ha kiderited, hogy az imageEditorban betett kepet milyen RT_XXX - el kell beolvasni, ne tartsd meg magadnak :)

 

Ismeretlen Személy :) Creative Commons License 2011.10.12 0 0 8742

...

Stream:=TREsources.Create(HIstance,'kep',RT_RCDATA);

Try
Image.Picture.Bitmap.LoadFromStream(Stream);

Finally

Stream.free;

...

 

Ezzel csinálom, de erre írja azt a hiba üzenetet

Előzmény: attoparsec (8740)
Munchausen Creative Commons License 2011.10.12 0 0 8741

Tudom, hogy ez nem szorosan kapcsolodik a topik temajahoz, de mivel nem talaltam mast, gondoltam itt kerdezem meg, hogy kodolt-e mar valaki Lazarus-al MAC alatt, mik a tapasztalatai?

attoparsec Creative Commons License 2011.10.11 0 0 8740

tBitmap.saveToStream/loadFromSteam

Előzmény: Ismeretlen Személy :) (8737)
Ismeretlen Személy :) Creative Commons License 2011.10.10 0 0 8739

Miért van az, hogy RES fájból akarok beletenni egy képet egy Image-ba a program futása közben és mindig ez a hibaüzenet jön elő:

Bitmap with unknown compression ([szám])

Előzmény: kisspetya (8738)
kisspetya Creative Commons License 2011.10.09 0 0 8738

Miért akarsz képet ugyanabba a fájlba menteni? Elmented jpg-be, aztán a fájlnevet mint hivatkozást írod a fájlodba.
De mondjuk megoldható. Pl. a pixeleket átváltod hexába és a hexa-értékeket írod a szöveges fájlodba. Lásd: a Delphi dfm fájlai. De ez jóval lassabb és macerásabb.

Előzmény: Ismeretlen Személy :) (8737)
Ismeretlen Személy :) Creative Commons License 2011.10.09 0 0 8737

Most már tudom, hogy fogom az eseményeket tárolni egy saját fájlban. De képeket, hogy mentem bele a fájlba?

Ismeretlen Személy :) Creative Commons License 2011.10.09 0 0 8736

Reméltem automatikussan elmozdul, de hát akkor programozzunk.:-) Kösz.

Előzmény: kisspetya (8735)
kisspetya Creative Commons License 2011.10.08 0 0 8735

Fáradt vagyok, de leesett mit akarsz :)
Van a Scrollboxnak OnMouseWheel eseménye. (meg OnMouseWheelUp és OnMouseWheelDown is)
Na ezeket olvasd el. Itt neked kell manuálisan elmozdítani a box belső tartalmát.

Előzmény: Ismeretlen Személy :) (8733)
kisspetya Creative Commons License 2011.10.08 0 0 8734

A ScrollBoxon belül mi van? Pl. ha egy 200x200-as ScrollBoxba beteszel egy 400x400-as panelt, akkor az scrollozható.

Előzmény: Ismeretlen Személy :) (8733)
Ismeretlen Személy :) Creative Commons License 2011.10.08 0 0 8733

Basszus tényleg, még régen használtam is valamelyik programomban az ssLeftet.:-) Köszi.

"És még: a Scrollok miért nem mozognak, ha a görgetőt nem használom?"

Rosszul írtam, helye mondat: a Scrollol miért nem mozognak, ha a görgetőt használom?:-)

ScrollBoxban vannak a csúszkák, de megse moccannak, ha görgetem a görgetőt.

 

 

 

Előzmény: kisspetya (8732)
kisspetya Creative Commons License 2011.10.08 0 0 8732

"Csak az a baj a MouseMove nem tartalmazza a lenyomott egérgombt megadó paramétert."
Már hogyne adná vissza. A Shift: TShiftState; paraméter az.
Pl:
if ssLeft in Shift then /* bal gomb nyomva */ ;

"És még: a Scrollok miért nem mozognak, ha a görgetőt nem használom?"
Itt most mit is scrollozol? Létezik olyan, hogy TScrollBox. Talán arra lenne szükséged.

Előzmény: Ismeretlen Személy :) (8731)
Ismeretlen Személy :) Creative Commons License 2011.10.08 0 0 8731

Problémába ütköztem, most más jellegűbe.

A szerkeztőt csinálom, csináltam egy menüt, ahol File/Új-jal lehet új térképet megadni méretekkel együtt. Amikor megnyitja, akkor egy kis térképet is csináltam neki a jobb felső sarokba, hogy könnyeb legyen a térképen való ugrás. Ha rá kattintok valahova a kis térképen, akkor nagyon jól arányossan oda ugrik a nagytérképre ahova kell.

De én azt szeretném, ha le van nyomva a bal egérgomb, és úgy mozgatom a kis térképen, úgy mozogjon a nagy térképen is. Csak az a baj a MouseMove nem tartalmazza a lenyomott egérgombt megadó paramétert. Akkor gondoltam semmi baj, ha lenyomom a gombot a kistérképen a MouseDown eljárásban egy általam deklarált BalGomb Boolean változó igaz lesz és MouseMove-nél csak akkor mozog, ha BalGomb=True. Csak, amikor felengedem megkéne addni azt, hogy BalGomb:=False, ez se lenne probléma. De mivan, ha én mozgatásközben kijövők a kistérképről és ott engedem fel az egérgombot. Ezért nekem kéne, egy olyan amivel megtudom vizsgálni a gombok állapotát. Valaki tud ilyet, vagy valami más megoldást.

 

És még: a Scrollok miért nem mozognak, ha a görgetőt nem használom? Az is nekem kell beprogramoznom?

Előre is köszönöm.

Ismeretlen Személy :) Creative Commons License 2011.10.07 0 0 8730

Na most már értem azt hiszem menni fog. Köszi.

 

Nevemteve: én 12.-es vagyok és még csak most tanuljuk az algoritmus készítést (iszonyat lassú tempóban), gyakorlatban még nem programoztunk, pedig Infoszakra járok.

Előzmény: attoparsec (8729)
attoparsec Creative Commons License 2011.10.06 0 0 8729

a writeMapToStream(fileStream: tFileStream); eljaras (es a parja, readMapFromStream) egy fileStream nevu, tFileStream tipusu obiektumot kap parameterkent. ez a parameter a stream (folyam) ami a fajlra vonatkozik, es felteteleztem, fogy ez a folyam mar meg van nyitva.

amikor megnyitod a stream-et, akkor rendeled hozza egy fajlhoz. onnan kezdve a stream minden write/read utasitasa abba a fajlba ir / onnan olvas, ami a streamhez van rendelve.

 

(nezd meg a delphi helpjeben a tFileStream osztaly metodusait, hogy lasd mire kepes es hogy kell hasznalni. meg sokszor lesz ra szukseged).

 

egy fajlba igy tudod menteni az adataidat:

 

procedure writeMapToFile(fileName: string);

var fileStream: tFileStream;

begin

  fileStream:= tFileStream.create(fileName,  fmCreate); // itt hozod letre a fileStream obiektumot;

                                                                                       // egyuttal a fileName nevu fajlt is letrehozza

                                                                                       // es hozzarendeli a fajlt a folyamhoz

 try

    writeMapToStream(fileStream);    // itt a mar megnyitott folyamot adod at a multkori eljarasnak

  finally

     fileStream.free;   // felszabaditod az obiektumot, egyuttal a fajlt is bezarja

  end;

end;

 

a try / finally konstruckcio arra jo, hogy mindenkeppen lezarja a fajlt, meg akkor is, ha barmilyen kivetel (exception) keletkezik a writeMapToFile futasa kozben. (a try/finally-nak is erdemes pontosabban utananezni).

 

az olvasas igy nezne ki:

 

procedure readMapFromFile(fileName: string);

var fileStream: tFileStream;

begin

  fileStream:= tFileStream.create(fileName,  fmOpenRead); // itt hozod letre a fileStream obiektumot;

                                                                                       // egyuttal a fileName nevu fajlt is megnyitja olvasasra

                                                                                       // es hozzarendeli a fajlt a folyamhoz

 try

    readMapFromStream(fileStream);    // itt a mar megnyitott folyamot adod at a multkori eljarasnak

  finally

     fileStream.free;   // felszabaditod az obiektumot, egyuttal a fajlt is bezarja

  end;

end;

 

most mar meghivhatod ezeket az eljarasokat igy :

...

writeMapToFile('elsopalya.kfj');

...

readMapFromFile('elsopalya.kfj');

 

good luck :)

 

Előzmény: Ismeretlen Személy :) (8725)
NevemTeve Creative Commons License 2011.10.06 0 0 8728

Majdnem... először megnyitod a fájlt, visszakapsz egy handle-t, és azt használod a read/write/close stb műveletknél... (Azért ez az én időmben az általános iskola második osztályában tananyag volt ám.)

Előzmény: Ismeretlen Személy :) (8727)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!