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.
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.
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.
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.
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.
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.
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.
É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.:-)
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}
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 :)
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?
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.
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.
"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.
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?
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.
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
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.)