Új hozzászólás Aktív témák

  • Fire/SOUL/CD
    félisten

    Sziasztok!
    Ismét segítséget szeretnék kérni. Készülő programomban a használható gombokat szeretném átdefiniáltatni a felhasználóval.
    Van a fő form1, meg azon egy TPanel, amely szülőobjektuma pár TBitBtn gombnak, amikre rákattintva bejön a gombnyomást érzékelő adatbekérő felület.
    Azt szeretném, hogy ha a form1-en nyom gombot a felhasználó, akkor haladjon tovább a program a panel és a gombjai törlődésével, míg a gombokra kattintva a kezelőgombokat tudja átdefiniálni egy-egy billentyűleütéssel.
    Viszont ha a TBitBtn-okra kattintok, akkor utána nem tudom hogyan kell visszaadni a vezérlést a form1-nek. Amiket keresgélés után találtam válaszok, nem működnek, pl. az
    ActiveControl:=form1;
    is hibát jelez, hogy letiltott vagy nem látható a form.
    Meg lehet ezt a gombátdefiniálást könnyebben is csinálni valahogy? Jó úton járok egyáltalán ezzel a kóddal?
    urh1panel:=TPanel.Create(form1);
    urh1panel.Parent:=form1;
    urh1panel.color:=clGreen; 
    urh1panel.Left:=10;
    urh1panel.Top:=(form1.height div 2)-10;
    urh1panel.Width:=form1.width div 4;
    urh1panel.Height:=form1.height div 2;
    //
    urh1gombbalra:=TBitBtn.Create(urh1panel);
    urh1gombbalra.Parent:=urh1panel;
    urh1gombbalra.Left:=4;
    urh1gombbalra.Top:=4;
    urh1gombbalra.width:=urh1panel.width div 2;    urh1gombbalra.Glyph.LoadFromFile('kepek\ikonbalra.bmp');
    (...)
    urh1gombbalra.DoubleBuffered:=true;
    urh1gombbalra.OnClick:=@form1.j1bgbeallit;

    procedure TForm1.j1bgbeallit(Sender: TObject);
    begin
        //Billentyűnyomás intézése...
        form1.enabled:=true;
        form1.visible:=true;
        form1.SetFocus;
    end;

    urh1gombbalra.OnClick:=@form1.j1bgbeallit;
    Ezt a módszert TMethod record esetén használjuk.
    Ezen a linken megtalálod a helyes módszert, meg lejjebb, hogy a TMethod-nál hogy megy ez (amire szvsz nincs szükséged)

  • Tomi_78
    aktív tag

    Sziasztok!
    Ismét segítséget szeretnék kérni. Készülő programomban a használható gombokat szeretném átdefiniáltatni a felhasználóval.
    Van a fő form1, meg azon egy TPanel, amely szülőobjektuma pár TBitBtn gombnak, amikre rákattintva bejön a gombnyomást érzékelő adatbekérő felület.
    Azt szeretném, hogy ha a form1-en nyom gombot a felhasználó, akkor haladjon tovább a program a panel és a gombjai törlődésével, míg a gombokra kattintva a kezelőgombokat tudja átdefiniálni egy-egy billentyűleütéssel.
    Viszont ha a TBitBtn-okra kattintok, akkor utána nem tudom hogyan kell visszaadni a vezérlést a form1-nek. Amiket keresgélés után találtam válaszok, nem működnek, pl. az
    ActiveControl:=form1;
    is hibát jelez, hogy letiltott vagy nem látható a form.
    Meg lehet ezt a gombátdefiniálást könnyebben is csinálni valahogy? Jó úton járok egyáltalán ezzel a kóddal?
    urh1panel:=TPanel.Create(form1);
    urh1panel.Parent:=form1;
    urh1panel.color:=clGreen; 
    urh1panel.Left:=10;
    urh1panel.Top:=(form1.height div 2)-10;
    urh1panel.Width:=form1.width div 4;
    urh1panel.Height:=form1.height div 2;
    //
    urh1gombbalra:=TBitBtn.Create(urh1panel);
    urh1gombbalra.Parent:=urh1panel;
    urh1gombbalra.Left:=4;
    urh1gombbalra.Top:=4;
    urh1gombbalra.width:=urh1panel.width div 2;    urh1gombbalra.Glyph.LoadFromFile('kepek\ikonbalra.bmp');
    (...)
    urh1gombbalra.DoubleBuffered:=true;
    urh1gombbalra.OnClick:=@form1.j1bgbeallit;

    procedure TForm1.j1bgbeallit(Sender: TObject);
    begin
        //Billentyűnyomás intézése...
        form1.enabled:=true;
        form1.visible:=true;
        form1.SetFocus;
    end;

  • vz12
    tag

    Szia!
    Kipróbáltam a zárójelezést, és úgy tűnik, ezzel jó lett: lényegesen változatosabbak és hihetőbbek a kapott értékek, úgyhogy nagyon szépen köszönöm ezt a tanácsodat is.
    Azt hittem, oda nem kellenek zárójelek, mert a DIV nem az előtte levő -1-est veszi figyelembe, de úgy látszik, tévedtem és erre jobban kell ügyelnem a jövőben.
    Így néz ki tehát a jó megoldás:
    for i:=0 to length(o1szamdb)-1 do
    begin
       if oszlop1[j]=o1szamdb[i,0] then
       begin
               if i<=(length(o1szamdb)-1) div 3 then szamgyak[j,0]:=1
               else if i<=(length(o1szamdb)-1) div 2 then szamgyak[j,0]:=2
               else szamgyak[j,0]:=3;
               break;
       end;
    end;

    Hello!

    Örülök, ha ettől megjavult, bár én nem vagyok erről teljesen meggyőződve, de Te ezt jobban tudod, mert jobban érted a feladatot és a megoldásodat is. Attól, hogy "változatosabb" a számsor, még nem biztos, hogy jó, de lehetséges. Igazából nem sokat nézegettem, és ezalatt (meg a hiányos kód miatt) nem tudtam megfejteni a dolgokat.
    A DIV biztos hogy rossz volt, valóban.

  • Tomi_78
    aktív tag

    Hello!

    Csak kisebb észrevételeim vannak, mert számomra nem teljesen egyértelmű a feladat, és a megértésben a kódod sem sokat segített.
    - a leggyanúsabb dolog nekem az a "break" a kódban
    - szamgyak[j,0]-be gyűjtesz, szamgyak[i,j]-t írsz ki (2. index?)
    - "length(o1szamdb)-1 div 3" az egyenlő "length(o1szamdb)"-vel, mert (1 div 3) = 0, ugyanis a "div" prioritása magasabb a "-" prioritásánál, szerintem nem erre gondoltál, zárójelezni kellene
    - "div 2"-re ugyanez
    - túl bonyolult ez az egész, gondolkozz jobb megoldáson

    Szia!
    Kipróbáltam a zárójelezést, és úgy tűnik, ezzel jó lett: lényegesen változatosabbak és hihetőbbek a kapott értékek, úgyhogy nagyon szépen köszönöm ezt a tanácsodat is.
    Azt hittem, oda nem kellenek zárójelek, mert a DIV nem az előtte levő -1-est veszi figyelembe, de úgy látszik, tévedtem és erre jobban kell ügyelnem a jövőben.
    Így néz ki tehát a jó megoldás:
    for i:=0 to length(o1szamdb)-1 do
    begin
       if oszlop1[j]=o1szamdb[i,0] then
       begin
               if i<=(length(o1szamdb)-1) div 3 then szamgyak[j,0]:=1
               else if i<=(length(o1szamdb)-1) div 2 then szamgyak[j,0]:=2
               else szamgyak[j,0]:=3;
               break;
       end;
    end;

  • vz12
    tag

    Sziasztok!
    Abba a problémába ütköztem, hogy adott egy számsorozat, amit egy Memo tárol, s így néz ki:
    8-14-38-41-48-1-11
    3-20-27-37-44-1-2
    8-13-15-17-37-3-7
    13-18-19-29-32-8-9
    18-36-39-45-50-6-9
    16-26-32-37-45-2-3
    8-16-37-39-48-5-11
    2-16-27-33-47-6-12
    1-17-19-25-41-6-12
    (és még jó hosszú)
    Ebből ki van válogatva, hogy:
    A számoszlopokban az egyes számokból ennyi van:
    1. oszlop: (33 különféle)
    1: 86 db.
    2: 69 db.
    3: 65 db.
    4: 58 db.
    6: 56 db.
    (...)
    Ebből pl. az 1. oszlop különféle számait az o1szamdb tömb tárolja, és így íródott ki ez alapján az előző:
    Kiiro.Lines.Add('A számoszlopokban az egyes számokból ennyi van:');
    Kiiro.Lines.Add('1. oszlop: ('+inttostr(length(o1szamdb))+' különféle)');
    for i:=0 to length(o1szamdb)-1 do
    begin
         Kiiro.Lines.Add(inttostr(o1szamdb[i,0])+': '+inttostr(o1szamdb[i,1])+' db.');
    end;
    Még azt kellene megoldanom, hogy ezekből a tömbökből melyek a leggyakoribb (első 1/3 darabba esők, 1-es jelzést kapnak), a közepesen gyakori (kb. a felénél kisebb, 2-es jelzést kapnak) és a ritkább számok (felénél nagyobb tartományba esnek, így 3 a jelzésük). Ehhez a következő kóddal próbálkoztam:
    for j:=0 to memo1sorhossz do
     begin
          for i:=0 to length(o1szamdb)-1 do
          begin
             if oszlop1[j]=o1szamdb[i,0] then
             begin
               if i<=length(o1szamdb)-1 div 3 then szamgyak[j,0]:=1 //Első 1/3-ban levő szám a leggyakoribb
               else if i<=length(o1szamdb)-1 div 2 then szamgyak[j,0]:=2 //Felénél fentebb a közepes
               else szamgyak[j,0]:=3; //Legritkább
               break;
             end;
          end;
    (...)
    De ha ez alapján kiíratom pl. az első 10-et, akkor mindig 1-est kapok, holott vannak benne szép számmal közepes és ritkább számok is (2-es és 3-as):
    for i:=0 to 10 do
    begin
         for j:=0 to 4 do
             Kiiro.Lines.Add(inttostr(szamgyak[i,j]));
    end;
    Valamit rosszul csinálok a kiválogató kódban? De mi lehet a hiba?

    Hello!

    Csak kisebb észrevételeim vannak, mert számomra nem teljesen egyértelmű a feladat, és a megértésben a kódod sem sokat segített.
    - a leggyanúsabb dolog nekem az a "break" a kódban
    - szamgyak[j,0]-be gyűjtesz, szamgyak[i,j]-t írsz ki (2. index?)
    - "length(o1szamdb)-1 div 3" az egyenlő "length(o1szamdb)"-vel, mert (1 div 3) = 0, ugyanis a "div" prioritása magasabb a "-" prioritásánál, szerintem nem erre gondoltál, zárójelezni kellene
    - "div 2"-re ugyanez
    - túl bonyolult ez az egész, gondolkozz jobb megoldáson

  • Tomi_78
    aktív tag

    Sziasztok!
    Abba a problémába ütköztem, hogy adott egy számsorozat, amit egy Memo tárol, s így néz ki:
    8-14-38-41-48-1-11
    3-20-27-37-44-1-2
    8-13-15-17-37-3-7
    13-18-19-29-32-8-9
    18-36-39-45-50-6-9
    16-26-32-37-45-2-3
    8-16-37-39-48-5-11
    2-16-27-33-47-6-12
    1-17-19-25-41-6-12
    (és még jó hosszú)
    Ebből ki van válogatva, hogy:
    A számoszlopokban az egyes számokból ennyi van:
    1. oszlop: (33 különféle)
    1: 86 db.
    2: 69 db.
    3: 65 db.
    4: 58 db.
    6: 56 db.
    (...)
    Ebből pl. az 1. oszlop különféle számait az o1szamdb tömb tárolja, és így íródott ki ez alapján az előző:
    Kiiro.Lines.Add('A számoszlopokban az egyes számokból ennyi van:');
    Kiiro.Lines.Add('1. oszlop: ('+inttostr(length(o1szamdb))+' különféle)');
    for i:=0 to length(o1szamdb)-1 do
    begin
         Kiiro.Lines.Add(inttostr(o1szamdb[i,0])+': '+inttostr(o1szamdb[i,1])+' db.');
    end;
    Még azt kellene megoldanom, hogy ezekből a tömbökből melyek a leggyakoribb (első 1/3 darabba esők, 1-es jelzést kapnak), a közepesen gyakori (kb. a felénél kisebb, 2-es jelzést kapnak) és a ritkább számok (felénél nagyobb tartományba esnek, így 3 a jelzésük). Ehhez a következő kóddal próbálkoztam:
    for j:=0 to memo1sorhossz do
     begin
          for i:=0 to length(o1szamdb)-1 do
          begin
             if oszlop1[j]=o1szamdb[i,0] then
             begin
               if i<=length(o1szamdb)-1 div 3 then szamgyak[j,0]:=1 //Első 1/3-ban levő szám a leggyakoribb
               else if i<=length(o1szamdb)-1 div 2 then szamgyak[j,0]:=2 //Felénél fentebb a közepes
               else szamgyak[j,0]:=3; //Legritkább
               break;
             end;
          end;
    (...)
    De ha ez alapján kiíratom pl. az első 10-et, akkor mindig 1-est kapok, holott vannak benne szép számmal közepes és ritkább számok is (2-es és 3-as):
    for i:=0 to 10 do
    begin
         for j:=0 to 4 do
             Kiiro.Lines.Add(inttostr(szamgyak[i,j]));
    end;
    Valamit rosszul csinálok a kiválogató kódban? De mi lehet a hiba?

  • Tomi_78
    aktív tag

    Úgy látom, hogy a tegnapi linkem mára "elromlott", nem tudom, hogy miért.
    Keress a "smartscreen" szóra, ez a windows alkalmazás okozza ezt a jelenséget.

    Rendben és köszönöm a segítséget! :K

  • vz12
    tag

    Úgy látom, hogy a tegnapi linkem mára "elromlott", nem tudom, hogy miért.
    Keress a "smartscreen" szóra, ez a windows alkalmazás okozza ezt a jelenséget.

  • vz12
    tag

    Ez igaz. :K
    Még egy kérdésem van, ami nem kifejezetten Lazarus/Delphi, hanem általános témájú, de azért kapcsolódik hozzá is: ha az elkészített programjaimat letöltöm a honlapomról, akkor a Windows kis kék ablakban közli, hogy megvédte tőle a számítógépet és csak a Futtatás mindenképpen-re kattintva lehet aztán végül elindítani.
    Gondolom ez azért van, mert az operációs rendszer nem tudta azonosítani a program készítőjét.
    Ez hogyan oldható meg?
    Például Lazarus-ban hol és mit kell kitölteni az elkészült programomhoz, hogy a rendszer ismerje a készítőt (engem), az adatokat róla és azonnal futtatható legyen? Projekt beállításai/Alkalmazás-ban a Név és a Leírás? Azt kitöltöttem, mégsem jó neki.

    A kulcsszó: "digitális aláírás".
    Ez összetettebb kérdés, minthogy a projekt beállításoknál ezt meg lehessen oldani, ott nem lehet.
    Gyors kereséssel ezt találtam, ez elég jól elmagyarázza a helyzetet, elvileg ki is lehet kapcsolni a win-ben ezt a "védelmet":
    [link]

  • Tomi_78
    aktív tag

    Oké. Ha több megoldás is van (és általában ez a helyzet), akkor lehet választani közülük, főleg, ha az egyik nem működik. :)
    Érdemes mindig az egyszerűbbet választani, a bonyolítás ne legyen cél.

    Ez igaz. :K
    Még egy kérdésem van, ami nem kifejezetten Lazarus/Delphi, hanem általános témájú, de azért kapcsolódik hozzá is: ha az elkészített programjaimat letöltöm a honlapomról, akkor a Windows kis kék ablakban közli, hogy megvédte tőle a számítógépet és csak a Futtatás mindenképpen-re kattintva lehet aztán végül elindítani.
    Gondolom ez azért van, mert az operációs rendszer nem tudta azonosítani a program készítőjét.
    Ez hogyan oldható meg?
    Például Lazarus-ban hol és mit kell kitölteni az elkészült programomhoz, hogy a rendszer ismerje a készítőt (engem), az adatokat róla és azonnal futtatható legyen? Projekt beállításai/Alkalmazás-ban a Név és a Leírás? Azt kitöltöttem, mégsem jó neki.

  • vz12
    tag

    Ebbe úgy tűnik, beletört a bicskám, hogy úgy mondjam. Kipróbáltam azt is, hogy TPanel-t tettem az egész mögé, ami nagyjából segített is, de a kiírás mindig olyan rövid volt, mint az űrlapmező hossza, ezért nem írta ki teljesen. Meg az igazításával is bajban voltam.
    Megelégeltem és végül kis utánajárással InputBox-ra cseréltem ki az egészet, StrToIntDef-fel átalakítva a kapott szöveget számmá. Ez így most már megfelelő számomra.

    Oké. Ha több megoldás is van (és általában ez a helyzet), akkor lehet választani közülük, főleg, ha az egyik nem működik. :)
    Érdemes mindig az egyszerűbbet választani, a bonyolítás ne legyen cél.

  • Tomi_78
    aktív tag

    Hello!

    A Lazarus 4.0-ban is 3.2.2 az FPC, nem hinném, hogy az okozza a problémát.
    Nálam egy egyszerű teszt működött probléma nélkül.
    Nem akarok belemászni a kódodba, ezt meghagyom neked. Nálam egy egyszerű példa működött, próbáld ki Te is azt a minimál kódot egy új projektben. Ha ez nálad is működik, akkor valahol a Te "bonyolult" kódodat egyszerűsíteni kell, de debug-olhasz is, akár logfájlba is.

    Ennyi ötletem van, sok sikert a kísérletezéshez.
    Tapasztalatok szerzéséhez tök jó lesz ez a feladat.

    Ebbe úgy tűnik, beletört a bicskám, hogy úgy mondjam. Kipróbáltam azt is, hogy TPanel-t tettem az egész mögé, ami nagyjából segített is, de a kiírás mindig olyan rövid volt, mint az űrlapmező hossza, ezért nem írta ki teljesen. Meg az igazításával is bajban voltam.
    Megelégeltem és végül kis utánajárással InputBox-ra cseréltem ki az egészet, StrToIntDef-fel átalakítva a kapott szöveget számmá. Ez így most már megfelelő számomra.

  • vz12
    tag

    Az imént letöltöttem és telepítettem a 4.2-es Lazarus-t, de azt írja benne a névjegye, hogy 3.2.2-es FPC-t használ. Ez nem ugyanaz, mint a régi? És sajnos a hibák is változatlanok futtatáskor.

    Hello!

    A Lazarus 4.0-ban is 3.2.2 az FPC, nem hinném, hogy az okozza a problémát.
    Nálam egy egyszerű teszt működött probléma nélkül.
    Nem akarok belemászni a kódodba, ezt meghagyom neked. Nálam egy egyszerű példa működött, próbáld ki Te is azt a minimál kódot egy új projektben. Ha ez nálad is működik, akkor valahol a Te "bonyolult" kódodat egyszerűsíteni kell, de debug-olhasz is, akár logfájlba is.

    Ennyi ötletem van, sok sikert a kísérletezéshez.
    Tapasztalatok szerzéséhez tök jó lesz ez a feladat.

  • Tomi_78
    aktív tag

    Esetleg ha régebbi Lazarust használsz, próbáld ki a 4-es verzióval is.

    Egyébként nekem így néz ki nagyvonalakban az ezt kezelő kódrendszer:

    procedure TForm1.atmenukatt(Sender: TObject);
    varablak: TLabeledEdit;
    begin
              case TMenuItem(Sender).tag of
                   0: begin
                    (...)
                   end;
                   1: begin
                    (...)
                   end;
                   2: begin
                      ablak:=TLabeledEdit.Create(Form1);
                      ablak.Parent:=Form1;
                      ablak.NumbersOnly:=true;
                      case nyelv of
                       0: ablak.EditLabel.Caption:='Egy 2-65535 közötti szám.';
                       1: ablak.EditLabel.Caption:='A number between 2-65535.';
                      end;
                      ablak.Text:='';
                      ablak.Left:=width div 2;
                      ablak.Top:=height div 2;
                      ablak.OnKeyDown:=@menuszamadas;
                      aktkxhely:=khelyx div tvcsempeszel;
                      aktkyhely:=khelyy div tvcsempemag;
                 end;
            end;
    end;

    procedure TForm1.menuszamadas(Sender: TObject; var Key: word; Shift: TShiftState);
    begin
         if (Key=VK_RETURN) and ((Sender as TLabeledEdit).Text<>'') and (strtoint((Sender as TLabeledEdit).Text)>=2) and (strtoint((Sender as TLabeledEdit).Text)<=65535) then
         begin
            (...)
              //Itt kéne megsemmisíteni is az Ablak-ot, pl. FreeAndNil(Sender);
         end;
    end;

    procedure TForm1.tvracsegerkatt(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var iderakdx,iderakdy: word;
      atmenu: TPopupMenu;
      atmenupont0,atmenupont1,atmenupont2: TMenuItem;
    begin
      if Button=mbLeft then
      begin
       (...)
      end
    else //Jobb kattintásra létrejön a helyi menü:
      begin
           atmenu:=TPopUpMenu.Create(tvracskep);
           atmenupont0:=TMenuItem.Create(atmenu);
           case nyelv of
           0: atmenupont0.Caption:='0 (Üres)';
           1: atmenupont0.Caption:='0 (Empty)';
           end;
           atmenupont0.tag:=0;
           atmenupont0.OnClick:=@atmenukatt;
           atmenu.items.Add(atmenupont0);
           atmenupont1:=TMenuItem.Create(atmenu);
           case nyelv of
           0: atmenupont1.Caption:='1 (Akadály)';
           1: atmenupont1.Caption:='1 (Obstacle)';
           end;
           atmenupont1.tag:=1;
           atmenupont1.OnClick:=@atmenukatt;
           atmenu.items.Add(atmenupont1);
           atmenupont2:=TMenuItem.Create(atmenu);
           case nyelv of
           0: atmenupont2.Caption:='Egyéb érték';
           1: atmenupont2.Caption:='Other value';
           end;
           atmenupont2.tag:=2;
           atmenupont2.OnClick:=@atmenukatt;
           atmenu.items.Add(atmenupont2);
           atmenu.PopUp(ScreenToClient(mouse.cursorpos).X,ScreenToClient(mouse.cursorpos).Y);
      end;
    end;

  • Tomi_78
    aktív tag

    Esetleg ha régebbi Lazarust használsz, próbáld ki a 4-es verzióval is.

    Az imént letöltöttem és telepítettem a 4.2-es Lazarus-t, de azt írja benne a névjegye, hogy 3.2.2-es FPC-t használ. Ez nem ugyanaz, mint a régi? És sajnos a hibák is változatlanok futtatáskor.

  • vz12
    tag

    Hát, nem tudom, mi lehet... Egyébként én egy menü részeként hozom létre ezt az egészet, bár nem hiszem, hogy ez oszt vagy szoroz.
    Megkérdeztem a ChatGPT-t én is, ami azt mondta, hogy a TLabeledEdit-ben az űrlap az egy ablakkezelővel rendelkező összetevő, míg a címkéje az nem. És hogy emiatt pl. rakjam rá egy TPanel-ra, ami a szülője legyen.
    Úgyhogy jelenleg ennyi, amit tudok róla.

    Esetleg ha régebbi Lazarust használsz, próbáld ki a 4-es verzióval is.

  • Tomi_78
    aktív tag

    Hello!

    Oké, Lazarus 4.0-val kipróbáltam, és én mindent rendben találtam, akkor is, ha az
    " ablak.Parent:=Form1; "
    később történt, mint az
    " ablak.EditLabel.Caption:='Egy 2-65535 közötti szám.'; "
    (ha korábban van az " ablak.Parent:=Form1; ", akkor is jó.

    Valamint a
    " FreeAndNil(ablak); "
    is tökéletesen működött.
    Egy ScrollBox-ot is feltettem úgy, hogy takarja az ablakot, szerintem így is oké.

    A "Leszed" gomb megnyomása után:

    Hát, nem tudom, mi lehet... Egyébként én egy menü részeként hozom létre ezt az egészet, bár nem hiszem, hogy ez oszt vagy szoroz.
    Megkérdeztem a ChatGPT-t én is, ami azt mondta, hogy a TLabeledEdit-ben az űrlap az egy ablakkezelővel rendelkező összetevő, míg a címkéje az nem. És hogy emiatt pl. rakjam rá egy TPanel-ra, ami a szülője legyen.
    Úgyhogy jelenleg ennyi, amit tudok róla.

  • vz12
    tag

    Talán az lesz a hiba, hogy a Form1-en található egyéb összetevők (pl. ScrollBox és hasonlók) takarják a címkét - legalábbis ha a Form1 helyett a ScrollBox-ot adtam meg szülőnek, akkor látszódott. De az így nem jó nekem sajnos.
    Azért az érdekes, hogy az űrlap jól látszódik minden esetben, míg a címkéje nem. Mintha két külön dolog volna. Próbáltam a BringToFront-tal előrébbhozni, de az sem csinált semmit.

    Hello!

    Oké, Lazarus 4.0-val kipróbáltam, és én mindent rendben találtam, akkor is, ha az
    " ablak.Parent:=Form1; "
    később történt, mint az
    " ablak.EditLabel.Caption:='Egy 2-65535 közötti szám.'; "
    (ha korábban van az " ablak.Parent:=Form1; ", akkor is jó.

    Valamint a
    " FreeAndNil(ablak); "
    is tökéletesen működött.
    Egy ScrollBox-ot is feltettem úgy, hogy takarja az ablakot, szerintem így is oké.

    A "Leszed" gomb megnyomása után:

  • Tomi_78
    aktív tag

    Szia és köszönet a válaszért, de sajnos nem működött nálam a Lazarusban: bár áthelyeztem a szülőadás utasítását, de utána is csak az űrlap látszik.
    A másik problémám vele, hogy ezt az ablakot nem tudom hol megsemmisíteni, miután beíródtak az adatok és megnyomom az Enter-t. Csináltam ugyan neki egy OnKeyDown eseményt, de annak lefutásában hívni a FreeAndNil(ablak)-ot hibát okoz.

    Talán az lesz a hiba, hogy a Form1-en található egyéb összetevők (pl. ScrollBox és hasonlók) takarják a címkét - legalábbis ha a Form1 helyett a ScrollBox-ot adtam meg szülőnek, akkor látszódott. De az így nem jó nekem sajnos.
    Azért az érdekes, hogy az űrlap jól látszódik minden esetben, míg a címkéje nem. Mintha két külön dolog volna. Próbáltam a BringToFront-tal előrébbhozni, de az sem csinált semmit.

  • Tomi_78
    aktív tag

    Hello!

    A ChatGPT ezt mondta:

    ez egy klasszikus Delphi „csapda” a TLabeledEdit komponenssel kapcsolatban.
    A probléma oka az, hogy a TLabeledEdit belső címkéje (EditLabel) csak akkor jön létre és jelenik meg helyesen, ha a komponens Parent tulajdonságát beállítottad mielőtt a címkét módosítod.

    Most nem vagyok Delphi közelében, de nem hangzik hülyeségnek, próbáld ki.

    Szia és köszönet a válaszért, de sajnos nem működött nálam a Lazarusban: bár áthelyeztem a szülőadás utasítását, de utána is csak az űrlap látszik.
    A másik problémám vele, hogy ezt az ablakot nem tudom hol megsemmisíteni, miután beíródtak az adatok és megnyomom az Enter-t. Csináltam ugyan neki egy OnKeyDown eseményt, de annak lefutásában hívni a FreeAndNil(ablak)-ot hibát okoz.

  • vz12
    tag

    Sziasztok!
    Egy TLabeledEdit összetevővel szeretnék megjeleníteni egy kis ablakot, aminek van egy felirata és szerkeszthető része, de ezzel a kóddal csak a kis űrlap jelenik meg, de a felirat nem. Miért van ez így és mi a megoldás?
    ablak:=TLabeledEdit.Create(Form1);
    ablak.NumbersOnly:=true;
    case nyelv of
                       0: ablak.EditLabel.Caption:='Egy 2-65535 közötti szám.';
                       1: ablak.EditLabel.Caption:='A number between 2-65535.';
    end;
    ablak.Text:='';
    ablak.Left:=width div 2;
    ablak.Top:=height div 2;
    ablak.Parent:=Form1;

    Hello!

    A ChatGPT ezt mondta:

    ez egy klasszikus Delphi „csapda” a TLabeledEdit komponenssel kapcsolatban.
    A probléma oka az, hogy a TLabeledEdit belső címkéje (EditLabel) csak akkor jön létre és jelenik meg helyesen, ha a komponens Parent tulajdonságát beállítottad mielőtt a címkét módosítod.

    Most nem vagyok Delphi közelében, de nem hangzik hülyeségnek, próbáld ki.

  • Tomi_78
    aktív tag

    Sziasztok!
    Egy TLabeledEdit összetevővel szeretnék megjeleníteni egy kis ablakot, aminek van egy felirata és szerkeszthető része, de ezzel a kóddal csak a kis űrlap jelenik meg, de a felirat nem. Miért van ez így és mi a megoldás?
    ablak:=TLabeledEdit.Create(Form1);
    ablak.NumbersOnly:=true;
    case nyelv of
                       0: ablak.EditLabel.Caption:='Egy 2-65535 közötti szám.';
                       1: ablak.EditLabel.Caption:='A number between 2-65535.';
    end;
    ablak.Text:='';
    ablak.Left:=width div 2;
    ablak.Top:=height div 2;
    ablak.Parent:=Form1;

  • Tomi_78
    aktív tag

    Sziasztok!
    Az miért van, hogy nem akar ennél a TImage összetevőnél lefutni a Rajzolás esemény, csak ha a létrehozásakor nincs kikommentelve, ami most van?
    Tehát ez van most a procedure TForm1.FormCreate(Sender: TObject);-ben:
    mutatoteglalap:=TImage.Create(forrascsempelista);
    mutatoteglalap.Parent:=forrascsempelista;
    mutatoteglalap.Left:=0;
    mutatoteglalap.Top:=0;
    mutatoteglalap.width:=csempeszel;
    mutatoteglalap.height:=csempemag;
    //mutatoteglalap.Picture.Bitmap.SetSize(mutatoteglalap.width,mutatoteglalap.height);
    mutatoteglalap.OnPaint:=@mtrajzolas;
    És ha nincs kikommentelve, egyből rajzol, anélkül meg bárhol Invalidate-ezgetem, semmi eredménye, még a ShowMessage() sem fut le benne. De nekem csak akkor kéne rajzolnia, ha kattintok, akkor is egy szaggatott vonalú négyzetet, és úgy, hogy alatta látszódjon a kép.

  • Tomi_78
    aktív tag

    Annyiban előrébbjutottam, hogy a Form1-re már ki tudom rajzolni háttér nélkül a rácsot, de az eredeti helyére, ahová kellene, oda még nem. Ott mindig mutatja a vászna fekete háttérszínét, vagy ha megjegyzéssé teszek bizonyos sorokat, akkor semmit sem látni:
    procedure TForm1.racsmutatoGombMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if tvracsmutat=true then begin tvracsmutat:=false; if vantvracs=true then begin FreeAndNil(tvracskep); vantvracs:=false; end; end else begin tvracsmutat:=true; if vantvracs=false then begin tvracskep:=TImage.Create(tvScrBox); tvracskep.Parent:=tvScrBox; tvracskep.Left:=0; tvracskep.Top:=0; tvracskep.width:=terepVaszon.width; tvracskep.height:=terepVaszon.Height; tvracsrajzolas(tvracskep); end; vantvracs:=true; end; end; procedure TForm1.tvracsrajzolas(Sender: TObject); var vszvonalhely,fugvonalhely: word; begin if tvracsmutat=true then begin fugvonalhely:=csempeszel; vszvonalhely:=csempemag; //with tvracskep do // Ha ezek ki vannak kommentelve, a rács látszódik, //begin // de nem a tvracskep koordinátáiban és nem is tudom eltüntetni. canvas.pen.color:=clBlue; while fugvonalhely<terepVaszon.width do begin canvas.line(fugvonalhely,0,fugvonalhely,terepVaszon.height); inc(fugvonalhely,csempeszel); end; while vszvonalhely<terepVaszon.height do begin canvas.line(0,vszvonalhely,terepVaszon.width,vszvonalhely); inc(vszvonalhely,csempemag); end; //end; end; end;

    Időközben megoldottam! :DD Néhány hét intenzív kísérletezgetés után végre csak a rácsvonalak látszódnak a kép fölött, bármiféle zavaró-kitakaró fekete vagy egyéb színű vásznak nélkül.
    Mit mondjak, nem volt könnyű eljutnom a megoldásig és párszor majdnem feladtam, de végül csak sikerült. :K

  • Tomi_78
    aktív tag

    Annyiban előrébbjutottam, hogy a Form1-re már ki tudom rajzolni háttér nélkül a rácsot, de az eredeti helyére, ahová kellene, oda még nem. Ott mindig mutatja a vászna fekete háttérszínét, vagy ha megjegyzéssé teszek bizonyos sorokat, akkor semmit sem látni:
    procedure TForm1.racsmutatoGombMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if tvracsmutat=true then begin tvracsmutat:=false; if vantvracs=true then begin FreeAndNil(tvracskep); vantvracs:=false; end; end else begin tvracsmutat:=true; if vantvracs=false then begin tvracskep:=TImage.Create(tvScrBox); tvracskep.Parent:=tvScrBox; tvracskep.Left:=0; tvracskep.Top:=0; tvracskep.width:=terepVaszon.width; tvracskep.height:=terepVaszon.Height; tvracsrajzolas(tvracskep); end; vantvracs:=true; end; end; procedure TForm1.tvracsrajzolas(Sender: TObject); var vszvonalhely,fugvonalhely: word; begin if tvracsmutat=true then begin fugvonalhely:=csempeszel; vszvonalhely:=csempemag; //with tvracskep do // Ha ezek ki vannak kommentelve, a rács látszódik, //begin // de nem a tvracskep koordinátáiban és nem is tudom eltüntetni. canvas.pen.color:=clBlue; while fugvonalhely<terepVaszon.width do begin canvas.line(fugvonalhely,0,fugvonalhely,terepVaszon.height); inc(fugvonalhely,csempeszel); end; while vszvonalhely<terepVaszon.height do begin canvas.line(0,vszvonalhely,terepVaszon.width,vszvonalhely); inc(vszvonalhely,csempemag); end; //end; end; end;

    Mi a franc van ezzel a rohadt programkód formázással??? :F

  • Tomi_78
    aktív tag

    Sziasztok!
    Készülő programomban van egy ScrollBox, azon pedig egy TImage kép (terepVaszon néven). Erre a TImage-re szeretnék még rajzolni rácsvonalakat, de úgy, hogy ne legyenek a TImage részei, mert később a rácsvonalak nélkül szeretném elmenteni és a rácsvonalak mutatása ki/bekapcsolható legyen.
    Mindennek megvalósítására létrehozok még egy TImage-et (tvracskep néven), amelynek a ScrollBox a szülője, hogy azon helyezkedjen el, és a TImage vásznához hozzárendelek egy BitMap képet, amelyen a rácsok rajzolása megtörtént.
    Ki is rajzolódik a rács, de mindig egy fekete háttéren, amit sehogy nem bírok eltüntetni, és így nem látszik az alatta levő kép.
    Lehetséges egyáltalán egy képen rajzolni valamit úgy, hogy a rajzkép áttetsző legyen a nem használt részein? Ha igen, hogyan?
    Itt a teljes kód, amit írtam:
    procedure TForm1.racsmutatoGombMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var bm: TBitmap;
      vszvonalhely,fugvonalhely: word;
    begin
      if tvracsmutat=true then
      begin
         tvracsmutat:=false;
         if vantvracs=true then
         begin
           FreeAndNil(tvracskep);
           vantvracs:=false;
         end;
      end
      else
      begin
        tvracsmutat:=true;
        if vantvracs=false then
        begin
          tvracskep:=TImage.Create(tvScrBox);
          tvracskep.Parent:=tvScrBox;
          tvracskep.Left:=0;
          tvracskep.Top:=0;
          tvracskep.width:=terepVaszon.width;
          tvracskep.height:=terepVaszon.Height;
          tvracskep.Transparent:=true;
          bm:=TBitmap.Create;
          bm.width:=terepVaszon.width;
          bm.height:=terepVaszon.Height;
          bm.PixelFormat:=pf32Bit;
          bm.Transparent:=true;
          bm.Mask(clBlack);
          fugvonalhely:=csempeszel;
          vszvonalhely:=csempemag;
          bm.canvas.pen.color:=clBlue;
          while fugvonalhely<terepVaszon.width do
          begin
              bm.canvas.line(fugvonalhely,0,fugvonalhely,terepVaszon.height);
              inc(fugvonalhely,csempeszel);
          end;
          while vszvonalhely<terepVaszon.height do
          begin
              bm.canvas.line(0,vszvonalhely,terepVaszon.width,vszvonalhely);
              inc(vszvonalhely,csempemag);
          end;
          tvracskep.picture.graphic:=bm;
          tvracskep.picture.graphic.transparent:=true;
          FreeAndNil(bm);
        end;
        vantvracs:=true;
      end;
    end;

    Annyiban előrébbjutottam, hogy a Form1-re már ki tudom rajzolni háttér nélkül a rácsot, de az eredeti helyére, ahová kellene, oda még nem. Ott mindig mutatja a vászna fekete háttérszínét, vagy ha megjegyzéssé teszek bizonyos sorokat, akkor semmit sem látni:
    procedure TForm1.racsmutatoGombMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if tvracsmutat=true then begin tvracsmutat:=false; if vantvracs=true then begin FreeAndNil(tvracskep); vantvracs:=false; end; end else begin tvracsmutat:=true; if vantvracs=false then begin tvracskep:=TImage.Create(tvScrBox); tvracskep.Parent:=tvScrBox; tvracskep.Left:=0; tvracskep.Top:=0; tvracskep.width:=terepVaszon.width; tvracskep.height:=terepVaszon.Height; tvracsrajzolas(tvracskep); end; vantvracs:=true; end; end; procedure TForm1.tvracsrajzolas(Sender: TObject); var vszvonalhely,fugvonalhely: word; begin if tvracsmutat=true then begin fugvonalhely:=csempeszel; vszvonalhely:=csempemag; //with tvracskep do // Ha ezek ki vannak kommentelve, a rács látszódik, //begin // de nem a tvracskep koordinátáiban és nem is tudom eltüntetni. canvas.pen.color:=clBlue; while fugvonalhely<terepVaszon.width do begin canvas.line(fugvonalhely,0,fugvonalhely,terepVaszon.height); inc(fugvonalhely,csempeszel); end; while vszvonalhely<terepVaszon.height do begin canvas.line(0,vszvonalhely,terepVaszon.width,vszvonalhely); inc(vszvonalhely,csempemag); end; //end; end; end;

  • Tomi_78
    aktív tag

    Sziasztok!
    Készülő programomban van egy ScrollBox, azon pedig egy TImage kép (terepVaszon néven). Erre a TImage-re szeretnék még rajzolni rácsvonalakat, de úgy, hogy ne legyenek a TImage részei, mert később a rácsvonalak nélkül szeretném elmenteni és a rácsvonalak mutatása ki/bekapcsolható legyen.
    Mindennek megvalósítására létrehozok még egy TImage-et (tvracskep néven), amelynek a ScrollBox a szülője, hogy azon helyezkedjen el, és a TImage vásznához hozzárendelek egy BitMap képet, amelyen a rácsok rajzolása megtörtént.
    Ki is rajzolódik a rács, de mindig egy fekete háttéren, amit sehogy nem bírok eltüntetni, és így nem látszik az alatta levő kép.
    Lehetséges egyáltalán egy képen rajzolni valamit úgy, hogy a rajzkép áttetsző legyen a nem használt részein? Ha igen, hogyan?
    Itt a teljes kód, amit írtam:
    procedure TForm1.racsmutatoGombMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var bm: TBitmap;
      vszvonalhely,fugvonalhely: word;
    begin
      if tvracsmutat=true then
      begin
         tvracsmutat:=false;
         if vantvracs=true then
         begin
           FreeAndNil(tvracskep);
           vantvracs:=false;
         end;
      end
      else
      begin
        tvracsmutat:=true;
        if vantvracs=false then
        begin
          tvracskep:=TImage.Create(tvScrBox);
          tvracskep.Parent:=tvScrBox;
          tvracskep.Left:=0;
          tvracskep.Top:=0;
          tvracskep.width:=terepVaszon.width;
          tvracskep.height:=terepVaszon.Height;
          tvracskep.Transparent:=true;
          bm:=TBitmap.Create;
          bm.width:=terepVaszon.width;
          bm.height:=terepVaszon.Height;
          bm.PixelFormat:=pf32Bit;
          bm.Transparent:=true;
          bm.Mask(clBlack);
          fugvonalhely:=csempeszel;
          vszvonalhely:=csempemag;
          bm.canvas.pen.color:=clBlue;
          while fugvonalhely<terepVaszon.width do
          begin
              bm.canvas.line(fugvonalhely,0,fugvonalhely,terepVaszon.height);
              inc(fugvonalhely,csempeszel);
          end;
          while vszvonalhely<terepVaszon.height do
          begin
              bm.canvas.line(0,vszvonalhely,terepVaszon.width,vszvonalhely);
              inc(vszvonalhely,csempemag);
          end;
          tvracskep.picture.graphic:=bm;
          tvracskep.picture.graphic.transparent:=true;
          FreeAndNil(bm);
        end;
        vantvracs:=true;
      end;
    end;

  • Tomi_78
    aktív tag

    Hááát, szerintem a help-ben benne kellene lennie a kódoknak, vagy a Google is segít, pl. a "Delphi key codes" keresése után, rengeteg találat van.
    Ha a numerikus kódokat saját szemeddel akarod látni, akkor pl. az OnKeyDown bemenő paramétereit írasd ki, ezeket el is tudod tárolni, mondjuk egy INI fájlban, majd később ezeket vissza is tudod olvasni, szövegből numerikus típussá alakítva vizsgálni is tudod. A régebbi Delphi-kben ez WORD típus, az újakban nem tudom. Kis/nagybetűkre figyelj.

    Köszi, akkor megnézem azt a keresési feltételt és próbálkozom az OnKeyDown paramétereinek kiíratásával.

  • vz12
    tag

    Sziasztok!
    Valaki tud nekem segíteni abban a problémámban, hogy hogyan lehet átdefiniálni a programban a gombokat? Tehát most pl. a nyíl gombokkal irányítok, de szeretném, ha a felhasználó ezeket kedve szerint állíthatná be.
    Hogy lehet a lenyomott gomb kódját eltárolni és felhasználni? Milyen adattípus kell hozzá?
    Most VK_LEFT, VK_RIGHT, VK_UP és VK_DOWN van használatban.

    Hááát, szerintem a help-ben benne kellene lennie a kódoknak, vagy a Google is segít, pl. a "Delphi key codes" keresése után, rengeteg találat van.
    Ha a numerikus kódokat saját szemeddel akarod látni, akkor pl. az OnKeyDown bemenő paramétereit írasd ki, ezeket el is tudod tárolni, mondjuk egy INI fájlban, majd később ezeket vissza is tudod olvasni, szövegből numerikus típussá alakítva vizsgálni is tudod. A régebbi Delphi-kben ez WORD típus, az újakban nem tudom. Kis/nagybetűkre figyelj.

  • Tomi_78
    aktív tag

    Sziasztok!
    Valaki tud nekem segíteni abban a problémámban, hogy hogyan lehet átdefiniálni a programban a gombokat? Tehát most pl. a nyíl gombokkal irányítok, de szeretném, ha a felhasználó ezeket kedve szerint állíthatná be.
    Hogy lehet a lenyomott gomb kódját eltárolni és felhasználni? Milyen adattípus kell hozzá?
    Most VK_LEFT, VK_RIGHT, VK_UP és VK_DOWN van használatban.

  • Tomi_78
    aktív tag

    > ujkep.pixelformat:=pf32bit;

    Az előző válaszomban lévő első sorban a "spéci" linken lévő megoldásnak is ez a lényege.
    Örülök, hogy örülsz, jó érzés megtalálni a megoldást egy problémára. :)

    Bizony jó érzés, és még jobb végre elkészülni a programmal. Ez egy kis képszerkesztő, amivel egyszerre nagy mennyiségű képet lehet átméretezni és átnevezni. Talán másoknak is jól jöhet, ezért beillesztem ide a letöltési címét: [link]
    És még egyszer, ezer köszönet a segítségért, Vz12! Bár a programfejlesztéssel ezzel nem állok le, sőt, vannak egyéb játékok és felhasználói programok még, amik megvalósításra várnak, ezért nem kizárt, hogy jövök még ide. :K

  • vz12
    tag

    Végül megtaláltam erre az áttetszőséges gondra a megoldást, ugyanis hirtelen ötlettől vezérelve megnéztem a bitmélységét a forrásképnek és az elmentettnek, és az előbbinek 32, míg az utóbbinak csak 24 bit.
    Ennek alapján ki kellett egészítenem a kódot ezzel a sorral:
    ujkep.pixelformat:=pf32bit;
    Az is fontos, hogy ez a kiegészítés a StretchDraw-ot tartalmazó sor elé kerüljön, különben ha utána tesszük, valamiért egy üres képet eredményez elmentve!
    Úgy örülök, hogy sikerült megcsinálni, mert sok képszerkesztési munkától fog megkímélni ez a kis program, ha végül készen lesz. :DD

    > ujkep.pixelformat:=pf32bit;

    Az előző válaszomban lévő első sorban a "spéci" linken lévő megoldásnak is ez a lényege.
    Örülök, hogy örülsz, jó érzés megtalálni a megoldást egy problémára. :)

  • Tomi_78
    aktív tag

    Itt van valami spéci megoldás Lazarus-ra (PNG): [link]

    Ha a Lazarusban van "TPNGImage", az máris megoldhatja, a régebbi Delphi-kben ez külső library lehetőségként megvolt, az újabbakban talán már benne van.

    Egyébként Google :), én sosem csináltam ilyet.

    Végül megtaláltam erre az áttetszőséges gondra a megoldást, ugyanis hirtelen ötlettől vezérelve megnéztem a bitmélységét a forrásképnek és az elmentettnek, és az előbbinek 32, míg az utóbbinak csak 24 bit.
    Ennek alapján ki kellett egészítenem a kódot ezzel a sorral:
    ujkep.pixelformat:=pf32bit;
    Az is fontos, hogy ez a kiegészítés a StretchDraw-ot tartalmazó sor elé kerüljön, különben ha utána tesszük, valamiért egy üres képet eredményez elmentve!
    Úgy örülök, hogy sikerült megcsinálni, mert sok képszerkesztési munkától fog megkímélni ez a kis program, ha végül készen lesz. :DD

  • vz12
    tag

    Jó lett, csak átlátszóság nincs, hanem fekete keretben van a képecske. Akkor lehet, hogy azt nem is tudja kezelni? Ez a kódom:
    procedure TForm1.Button2Click(Sender: TObject);
    var tarolokep,kiskep: TBitmap;
      ujkep: TPortableNetworkGraphic;
    begin
      if ListBox1.ItemIndex<>-1 then
      begin
         kiskep:=TBitmap.Create;
         ujkep:=TPortableNetworkGraphic.Create;
         tarolokep:=TBitmap.Create;
         ujkep.transparent:=true;
         kiskep.transparent:=true;
         tarolokep.transparent:=true;
         kiskep.Width:=strtoint(Edit1.Text);
         kiskep.Height:=strtoint(Edit2.Text);
         ujkep.LoadFromFile(mappa+ListBox1.Items.Strings[0]);
         tarolokep.assign(ujkep);
         kiskep.canvas.StretchDraw(rect(0,0,kiskep.width,kiskep.height),tarolokep);
         ujkep.assign(kiskep);
         ujkep.savetofile(mappa+'PROBA.png');
         kiskep.free;
         ujkep.free;
         tarolokep.free;
      end;
    end;

    Itt van valami spéci megoldás Lazarus-ra (PNG): [link]

    Ha a Lazarusban van "TPNGImage", az máris megoldhatja, a régebbi Delphi-kben ez külső library lehetőségként megvolt, az újabbakban talán már benne van.

    Egyébként Google :), én sosem csináltam ilyet.

  • Tomi_78
    aktív tag

    Nos, nem nagyon értek hozzá, de nem gondolnám, hogy csupán property-k állítgatásával újraÉPÍTI (konvertálja) a kép tartalmát, ezért menthette az eredeti képet. A property-k a vizualitásra hatással lehetnek, de BELÜL a kép szerintem NEM változik.

    Ezen link alapján (ott "procedure TForm1.Button2Click(Sender: TObject);") írtam egy egyszerű működő példát Delphi-ben, még a képernyőn sem jelenítettem meg semmit (a gombon kívül), csak gombnyomásra legyártja egy kép kicsinyített mását a méretarány megtartásával.
    1280x905 helyett 100x71 pixel.
    672 Kb helyett 5 Kb.
    Ja, a példa JPG-vel dolgozik, tehát JPG-ből JPG-t csinál (a köztes állapot BMP).
    Ha fontos a PNG, azt Te nyomozd ki.

    procedure TForm1.Button1Click(Sender: TObject);
    var Source: TJPEGImage;  Dest,Temp: TBitmap;
    begin
      Source:=TJpegImage.Create;
      try
        Dest:=TBitmap.Create;
        try
          Temp:=TBitmap.Create;
          try
            Source.LoadFromFile('VALAMI.JPG');
            Source.DIBNeeded;
            Dest.Assign(Source);
            Temp.width:=100;
          Temp.height:=Round(Source.height*(Temp.width/Source.width));
            Temp.Canvas.StretchDraw(Rect(0,0,Temp.width,Temp.height), Dest);
            Source.Assign(Temp);
            Source.SaveToFile('PROBA.JPG');
          finally
            Temp.Free;
          end;
        finally
          Dest.Free;
        end;
      finally
        Source.Free;
      end;
    end;

    A "Temp.SetSize()" nálam nem működött, azért változtattam meg.
    Olyan sok képformátumot NEM kezel a Delphi/Lazarus, tehát egy "általános" képkonvertáló program írására a fenti egyszerű módszerrel nem lehet messzire jutni.
    Kép méretezésre jó lehet JPG, BMP esetén.

    Jó lett, csak átlátszóság nincs, hanem fekete keretben van a képecske. Akkor lehet, hogy azt nem is tudja kezelni? Ez a kódom:
    procedure TForm1.Button2Click(Sender: TObject);
    var tarolokep,kiskep: TBitmap;
      ujkep: TPortableNetworkGraphic;
    begin
      if ListBox1.ItemIndex<>-1 then
      begin
         kiskep:=TBitmap.Create;
         ujkep:=TPortableNetworkGraphic.Create;
         tarolokep:=TBitmap.Create;
         ujkep.transparent:=true;
         kiskep.transparent:=true;
         tarolokep.transparent:=true;
         kiskep.Width:=strtoint(Edit1.Text);
         kiskep.Height:=strtoint(Edit2.Text);
         ujkep.LoadFromFile(mappa+ListBox1.Items.Strings[0]);
         tarolokep.assign(ujkep);
         kiskep.canvas.StretchDraw(rect(0,0,kiskep.width,kiskep.height),tarolokep);
         ujkep.assign(kiskep);
         ujkep.savetofile(mappa+'PROBA.png');
         kiskep.free;
         ujkep.free;
         tarolokep.free;
      end;
    end;

  • Tomi_78
    aktív tag

    Nos, nem nagyon értek hozzá, de nem gondolnám, hogy csupán property-k állítgatásával újraÉPÍTI (konvertálja) a kép tartalmát, ezért menthette az eredeti képet. A property-k a vizualitásra hatással lehetnek, de BELÜL a kép szerintem NEM változik.

    Ezen link alapján (ott "procedure TForm1.Button2Click(Sender: TObject);") írtam egy egyszerű működő példát Delphi-ben, még a képernyőn sem jelenítettem meg semmit (a gombon kívül), csak gombnyomásra legyártja egy kép kicsinyített mását a méretarány megtartásával.
    1280x905 helyett 100x71 pixel.
    672 Kb helyett 5 Kb.
    Ja, a példa JPG-vel dolgozik, tehát JPG-ből JPG-t csinál (a köztes állapot BMP).
    Ha fontos a PNG, azt Te nyomozd ki.

    procedure TForm1.Button1Click(Sender: TObject);
    var Source: TJPEGImage;  Dest,Temp: TBitmap;
    begin
      Source:=TJpegImage.Create;
      try
        Dest:=TBitmap.Create;
        try
          Temp:=TBitmap.Create;
          try
            Source.LoadFromFile('VALAMI.JPG');
            Source.DIBNeeded;
            Dest.Assign(Source);
            Temp.width:=100;
          Temp.height:=Round(Source.height*(Temp.width/Source.width));
            Temp.Canvas.StretchDraw(Rect(0,0,Temp.width,Temp.height), Dest);
            Source.Assign(Temp);
            Source.SaveToFile('PROBA.JPG');
          finally
            Temp.Free;
          end;
        finally
          Dest.Free;
        end;
      finally
        Source.Free;
      end;
    end;

    A "Temp.SetSize()" nálam nem működött, azért változtattam meg.
    Olyan sok képformátumot NEM kezel a Delphi/Lazarus, tehát egy "általános" képkonvertáló program írására a fenti egyszerű módszerrel nem lehet messzire jutni.
    Kép méretezésre jó lehet JPG, BMP esetén.

    Köszönöm, ezt kipróbálom. Jó lenne, ha az átlátszóságot is tudná kezelni, mert az is fontos most.

  • vz12
    tag

    És az miért van, hogy ebben a kis képméretező programomban mindig eredeti, nagy méretben mentődik el a betöltött kép, holott ha más értékeket adok meg neki az Edit1 és Edit2-ben, akkor abban mutatja a Form-on, de elmenteni mindig az eredetiben menti el?
    procedure TForm1.Button2Click(Sender: TObject);
    var ujkep: TImage;
    begin
      if ListBox1.ItemIndex<>-1 then
      begin
         ujkep:=TImage.Create(Self);
         ujkep.parent:=Form1;
       ujkep.autosize:=false;
         ujkep.Proportional:=true;
         ujkep.Stretch:=true;
         ujkep.picture.bitmap.setsize(strtoint(Edit1.Text),strtoint(Edit2.Text));
         ujkep.Picture.LoadFromFile(mappa+ListBox1.Items.Strings[0]);
        ujkep.picture.SaveToFile(mappa+'PROBA.png');
         //ujkep.free; //Mutatja a Form-on a kisképet, ha kommentelt.
      end;
    end;  

    Nos, nem nagyon értek hozzá, de nem gondolnám, hogy csupán property-k állítgatásával újraÉPÍTI (konvertálja) a kép tartalmát, ezért menthette az eredeti képet. A property-k a vizualitásra hatással lehetnek, de BELÜL a kép szerintem NEM változik.

    Ezen link alapján (ott "procedure TForm1.Button2Click(Sender: TObject);") írtam egy egyszerű működő példát Delphi-ben, még a képernyőn sem jelenítettem meg semmit (a gombon kívül), csak gombnyomásra legyártja egy kép kicsinyített mását a méretarány megtartásával.
    1280x905 helyett 100x71 pixel.
    672 Kb helyett 5 Kb.
    Ja, a példa JPG-vel dolgozik, tehát JPG-ből JPG-t csinál (a köztes állapot BMP).
    Ha fontos a PNG, azt Te nyomozd ki.

    procedure TForm1.Button1Click(Sender: TObject);
    var Source: TJPEGImage;  Dest,Temp: TBitmap;
    begin
      Source:=TJpegImage.Create;
      try
        Dest:=TBitmap.Create;
        try
          Temp:=TBitmap.Create;
          try
            Source.LoadFromFile('VALAMI.JPG');
            Source.DIBNeeded;
            Dest.Assign(Source);
            Temp.width:=100;
          Temp.height:=Round(Source.height*(Temp.width/Source.width));
            Temp.Canvas.StretchDraw(Rect(0,0,Temp.width,Temp.height), Dest);
            Source.Assign(Temp);
            Source.SaveToFile('PROBA.JPG');
          finally
            Temp.Free;
          end;
        finally
          Dest.Free;
        end;
      finally
        Source.Free;
      end;
    end;

    A "Temp.SetSize()" nálam nem működött, azért változtattam meg.
    Olyan sok képformátumot NEM kezel a Delphi/Lazarus, tehát egy "általános" képkonvertáló program írására a fenti egyszerű módszerrel nem lehet messzire jutni.
    Kép méretezésre jó lehet JPG, BMP esetén.

  • Tomi_78
    aktív tag

    És az miért van, hogy ebben a kis képméretező programomban mindig eredeti, nagy méretben mentődik el a betöltött kép, holott ha más értékeket adok meg neki az Edit1 és Edit2-ben, akkor abban mutatja a Form-on, de elmenteni mindig az eredetiben menti el?
    procedure TForm1.Button2Click(Sender: TObject);
    var ujkep: TImage;
    begin
      if ListBox1.ItemIndex<>-1 then
      begin
         ujkep:=TImage.Create(Self);
         ujkep.parent:=Form1;
       ujkep.autosize:=false;
         ujkep.Proportional:=true;
         ujkep.Stretch:=true;
         ujkep.picture.bitmap.setsize(strtoint(Edit1.Text),strtoint(Edit2.Text));
         ujkep.Picture.LoadFromFile(mappa+ListBox1.Items.Strings[0]);
        ujkep.picture.SaveToFile(mappa+'PROBA.png');
         //ujkep.free; //Mutatja a Form-on a kisképet, ha kommentelt.
      end;
    end;  

  • vz12
    tag

    Az lehet baj, hogy maga a gomb létrehozás is a FormKeyDown() eseményben van? A következőképpen:
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
      );
    begin
      if Key=VK_ESCAPE then
         kilepgombkatt(form1)
      else
      begin
        case jatallapot of
        2: begin
                kilepgomb:=TButton.Create(form1);
                kilepgomb.Parent:=form1;
                kilepgomb.Top:=2;
                kilepgomb.Left:=2;
                kilepgomb.Caption:='Esc';
                kilepgomb.OnKeyDown:=@FormKeyDown;
                kilepgomb.OnClick:=@kilepgombkatt;

    Szerintem az baj, bizony.
    Én a FormCreate-be tettem, illetve a programozott létrehozásokat, valamint a kezdeti beállításokat a fő formra vonatkozóan mindig odateszem.
    Legfeljebb ELREJTEM addig, amíg nem kell.

    Ahogy látom, a "jatallapot=2" esetén lehet, hogy elég sokszor létrehozza azt a gombot és esetleg besokall a gép, persze nem ismerem a vezérlésedet, de onnan tedd át máshova gyorsan, ami garantáltan egyszer fut le, pl. a FormCreate-be.

  • Tomi_78
    aktív tag

    Hát, nem tudok mit mondani, vettem a fáradtságot, és LAZARUS-ban kipróbáltam, mielőtt beküldtem ide, és nálam működött.

    A form "KeyDown"-ja valóban a "FormKeyDown" eljárásra mutat? Nálad is az a neve? Nem változtattad meg? Mert ha igen, akkor a megváltoztatott eljárás nevet kell odaírni a vastagbetűs sorba, de ez triviális.

    Nem tudom, hogy mi a problémája a pupup menüvel, meg hogy milyen töréspontokról van szó, meg hogy milyen köze van a "keydown"-hoz, szerintem semmi.

    Az lehet baj, hogy maga a gomb létrehozás is a FormKeyDown() eseményben van? A következőképpen:
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
      );
    begin
      if Key=VK_ESCAPE then
         kilepgombkatt(form1)
      else
      begin
        case jatallapot of
        2: begin
                kilepgomb:=TButton.Create(form1);
                kilepgomb.Parent:=form1;
                kilepgomb.Top:=2;
                kilepgomb.Left:=2;
                kilepgomb.Caption:='Esc';
                kilepgomb.OnKeyDown:=@FormKeyDown;
                kilepgomb.OnClick:=@kilepgombkatt;

  • vz12
    tag

    Valami hibát okozott a vastagbetűs sor beszúrása. Mellékeltem róla képet, mert nekem ez semmit nem mond...

    Hát, nem tudok mit mondani, vettem a fáradtságot, és LAZARUS-ban kipróbáltam, mielőtt beküldtem ide, és nálam működött.

    A form "KeyDown"-ja valóban a "FormKeyDown" eljárásra mutat? Nálad is az a neve? Nem változtattad meg? Mert ha igen, akkor a megváltoztatott eljárás nevet kell odaírni a vastagbetűs sorba, de ez triviális.

    Nem tudom, hogy mi a problémája a pupup menüvel, meg hogy milyen töréspontokról van szó, meg hogy milyen köze van a "keydown"-hoz, szerintem semmi.

  • vz12
    tag

    Köszönöm ezt is; kipróbálom!
    Csak azt nem értem, hogy amikor az egérrel nem a kilépés gombon vagyok, akkor is miért nem lehetett a billentyűt használni? Ezek szerint ha egyszer rákattintottam, akkor utána megmaradt nem aktívnak a Form?

    "Focus is the ability to receive user input through the mouse or keyboard. Only the object that has the focus can receive a keyboard event. Also, only one component per form can be active, or have the focus, in a running application at any given time.
    Some components, such as TImage, TPaintBox, TPanel and TLabel cannot receive focus. In general, components derived from TGraphicControl are unable to receive focus. Additionally, components that are invisible at run time (TTimer) cannot receive focus."
    -----------------
    Itt van még valami:
    To trap keystrokes at the form level instead of passing them to the form's components, set the form's KeyPreview property to True (using the Object Inspector). The component still sees the event, but the form has an opportunity to handle it first - to allow or disallow some keys to be pressed, for example.

    Magát a formot közvetlenül NEM bill. inputra tervezték (az a rátehető objektumok egy részének a feladata), de eseménykezelője van, a form csak úgy figyel a háttérben.

    Ha a formon beállítod a "KeyPreview=true"-t, akkor ELSŐDLEGESEN (központosítva) a form eseménykezelője dolgozza fel a bill. eseményeket, pl. a keydown-t is, MAJD AZUTÁN annak az objektumnak (pl. gombnak) a pl. keydown-ja is lefut, ahonnan a bill. lenyomás érkezett. A sorrend fontos, a form eseményben trükközni is lehet, mielőtt az objektum feldolgozná a bill. nyomást.

    Ha a "KeyPreview=false", akkor a form bill. kezelő eseményei hatástalanok (ez történt nálad is, mert a "false" az alapértelmezett). Ilyenkor az általam írt "központosítás", mint módszer/trükk használható, tehát a formon lévő OBJEKTUM eseménykezelője kapja el a bill. nyomást (mert a formé nem fogja), de a form eseménykezelője hajtra végre. Ez jó akkor, ha pl. nem akarod, hogy minden objektum esetén végrehajtódjon a "központi" kód, csak azoknál amelyeknél beállítod, illetve nem akarsz többszörösen (redundánsan) kódolni.

    A gyakorlatban: (a kilepgomb.OnKeyDown ki van kommentelve)

    form1.KeyPreview:=true;
    kilepgomb:=TButton.Create(form1);
    kilepgomb.Parent:=form1;
    kilepgomb.Top:=2;
    kilepgomb.Left:=2;
    kilepgomb.Caption:='Esc';
    // kilepgomb.OnKeyDown:=@FormKeyDown;
    kilepgomb.OnClick:=@kilepgombkatt;

  • Tomi_78
    aktív tag

    kilepgomb:=TButton.Create(form1);
    kilepgomb.Parent:=form1;
    kilepgomb.Top:=2;
    kilepgomb.Left:=2;
    kilepgomb.Caption:='Esc';
    kilepgomb.OnKeyDown:=@FormKeyDown;
    kilepgomb.OnClick:=@kilepgombkatt;

    Amikor a kilépés gombon állsz, akkor nem aktív a form, vagyis a bill. lenyomás NEM a form keydown-ja, hanem a button keydown-ja.
    Pl. a fenti módon át lehet irányítani az eseményeket, így "közös" keydown-ja lesz a gombnak és a formnak.
    :)

    Valami hibát okozott a vastagbetűs sor beszúrása. Mellékeltem róla képet, mert nekem ez semmit nem mond...

  • Tomi_78
    aktív tag

    kilepgomb:=TButton.Create(form1);
    kilepgomb.Parent:=form1;
    kilepgomb.Top:=2;
    kilepgomb.Left:=2;
    kilepgomb.Caption:='Esc';
    kilepgomb.OnKeyDown:=@FormKeyDown;
    kilepgomb.OnClick:=@kilepgombkatt;

    Amikor a kilépés gombon állsz, akkor nem aktív a form, vagyis a bill. lenyomás NEM a form keydown-ja, hanem a button keydown-ja.
    Pl. a fenti módon át lehet irányítani az eseményeket, így "közös" keydown-ja lesz a gombnak és a formnak.
    :)

    Köszönöm ezt is; kipróbálom!
    Csak azt nem értem, hogy amikor az egérrel nem a kilépés gombon vagyok, akkor is miért nem lehetett a billentyűt használni? Ezek szerint ha egyszer rákattintottam, akkor utána megmaradt nem aktívnak a Form?

  • vz12
    tag

    Na de ez a hibajelenség miért van:
    Van egy kilépésgomb a programomban, melyet így hozok létre és rendelem hozzá a kilépés kezelését végző függvényt:
    kilepgomb:=TButton.Create(form1);
                kilepgomb.Parent:=form1;
                kilepgomb.Top:=2;
                kilepgomb.Left:=2;
                kilepgomb.Caption:='Esc';
                kilepgomb.OnClick:=@kilepgombkatt;
    Ugyanakkor az ESC billentyű lenyomásával is szeretném vezérelni a kilépést, ezért ez van a FormKeyDown-ban:
    if Key=VK_ESCAPE then
         kilepgombkatt(form1)
      else (...)
    A kilepgombkatt()-ban ez történik:
    procedure TForm1.kilepgombkatt(Sender: TObject);
    var valasz,stilus: integer;
    begin
     stilus:=MB_ICONQUESTION + MB_YESNO;
     valasz:=Application.MessageBox('Biztosan ki akarsz lépni?', 'Megerősítés', stilus);
     if valasz=IDYES then close;
    end;
    Ha rákattintok egérrel a gombra és a NO-t választom, és utána egér helyett az ESC gombbal próbálnám ezt megint aktivizálni, akkor nem történik semmi. Magyarán ezután csak az egérkattintással tudok kilépni.
    Miért van ez így; mi történik a programban és hogyan javítható?

    kilepgomb:=TButton.Create(form1);
    kilepgomb.Parent:=form1;
    kilepgomb.Top:=2;
    kilepgomb.Left:=2;
    kilepgomb.Caption:='Esc';
    kilepgomb.OnKeyDown:=@FormKeyDown;
    kilepgomb.OnClick:=@kilepgombkatt;

    Amikor a kilépés gombon állsz, akkor nem aktív a form, vagyis a bill. lenyomás NEM a form keydown-ja, hanem a button keydown-ja.
    Pl. a fenti módon át lehet irányítani az eseményeket, így "közös" keydown-ja lesz a gombnak és a formnak.
    :)

  • Tomi_78
    aktív tag

    Na de ez a hibajelenség miért van:
    Van egy kilépésgomb a programomban, melyet így hozok létre és rendelem hozzá a kilépés kezelését végző függvényt:
    kilepgomb:=TButton.Create(form1);
                kilepgomb.Parent:=form1;
                kilepgomb.Top:=2;
                kilepgomb.Left:=2;
                kilepgomb.Caption:='Esc';
                kilepgomb.OnClick:=@kilepgombkatt;
    Ugyanakkor az ESC billentyű lenyomásával is szeretném vezérelni a kilépést, ezért ez van a FormKeyDown-ban:
    if Key=VK_ESCAPE then
         kilepgombkatt(form1)
      else (...)
    A kilepgombkatt()-ban ez történik:
    procedure TForm1.kilepgombkatt(Sender: TObject);
    var valasz,stilus: integer;
    begin
     stilus:=MB_ICONQUESTION + MB_YESNO;
     valasz:=Application.MessageBox('Biztosan ki akarsz lépni?', 'Megerősítés', stilus);
     if valasz=IDYES then close;
    end;
    Ha rákattintok egérrel a gombra és a NO-t választom, és utána egér helyett az ESC gombbal próbálnám ezt megint aktivizálni, akkor nem történik semmi. Magyarán ezután csak az egérkattintással tudok kilépni.
    Miért van ez így; mi történik a programban és hogyan javítható?

  • vz12
    tag

    Köszönöm a segítséget és a bátorítást! :K
    Mit mondjak... néha nem könnyű a programozás, főleg ha az embernek más segítsége nincs a környezetében, csak a világháló bújása meg a fórumok.

    Nincs mit. :)
    Valóban nem könnyű, és ezt a "civilek" legtöbbször nem látják, sokszor téves elképzeléseik vannak magáról a feladatról is, meg annak adott körülmények közötti megvalósításáról is, pl. időigény, stb. Az még a legszerencsésebb helyzet, ha az ember "nyomás nélkül" saját magának írja a programot, és van rá elég ideje meg elhivatottsága is.

  • Tomi_78
    aktív tag

    Nagyon jó változtatásnak tűnik a "letezik" helyett a "nil"-re vizsgálni, jó ötlet volt. :K

    > a FreeAndNil() nem azonnal töröl?
    A neve alapján illene azonnal törölnie.
    Ezt találtam gyorsan róla a neten: It calls an object's destructor
    Vagyis elvileg valóban töröl, megsemmisít, de többet erről csak az tud, aki írta a forráskódját ...

    Ha tényleg megszűntek a hibák, akkor "megérte" ennyit foglalkozni vele, valószínűleg sokáig megmaradó tapasztalatot szereztél vele, csak így tovább.

    Köszönöm a segítséget és a bátorítást! :K
    Mit mondjak... néha nem könnyű a programozás, főleg ha az embernek más segítsége nincs a környezetében, csak a világháló bújása meg a fórumok.

  • vz12
    tag

    Az imént átírtam ezeket:
    egysegek[edb].letezik=true
    erre:
    egysegek[edb]<>nil
    és így úgy tűnik, megszűntek a hibák. Valamint a törlést:
    freeandnil(egysegek[edb]);
    dec(egysegdb,1);
    setlength(egysegek,egysegdb);
    az eddigi egyetlen, letezik=false jelölésű helyről áttettem minden olyan helyre, ahol eddig ezt a letezik változót hamisra állítottam.
    De akkor ezek szerint a FreeAndNil() nem azonnal töröl? Csak nil-re állítja az objektumpéldányra a mutatót?

    Nagyon jó változtatásnak tűnik a "letezik" helyett a "nil"-re vizsgálni, jó ötlet volt. :K

    > a FreeAndNil() nem azonnal töröl?
    A neve alapján illene azonnal törölnie.
    Ezt találtam gyorsan róla a neten: It calls an object's destructor
    Vagyis elvileg valóban töröl, megsemmisít, de többet erről csak az tud, aki írta a forráskódját ...

    Ha tényleg megszűntek a hibák, akkor "megérte" ennyit foglalkozni vele, valószínűleg sokáig megmaradó tapasztalatot szereztél vele, csak így tovább.

  • Tomi_78
    aktív tag

    Az imént átírtam ezeket:
    egysegek[edb].letezik=true
    erre:
    egysegek[edb]<>nil
    és így úgy tűnik, megszűntek a hibák. Valamint a törlést:
    freeandnil(egysegek[edb]);
    dec(egysegdb,1);
    setlength(egysegek,egysegdb);
    az eddigi egyetlen, letezik=false jelölésű helyről áttettem minden olyan helyre, ahol eddig ezt a letezik változót hamisra állítottam.
    De akkor ezek szerint a FreeAndNil() nem azonnal töröl? Csak nil-re állítja az objektumpéldányra a mutatót?

  • Tomi_78
    aktív tag

    Nem tudom, próbáld ki. :)
    Ha nem jön be, akkor majd visszakapcsolod.

    Igen, a bekapcsolásával már érthetőbb lett az üzenet: pontosan kiírta, hogy melyik sor a hibás! :K Igaz, ezzel nem jutottam közelebb a megoldáshoz, mert nem tudom, hogy miért nem jó az. :N
    Lehet, hogy mégis a frissítéssel van a gond, ahogy írod? A példányok törlése valóban így megy 25 fps-es "invalidate"-enként:
    procedure TForm1.palyafrissites(Sender: TObject);
    begin
    ha nem létezik, törlés, különben műveletek vele.
    with canvas do invalidate;
    end;

  • vz12
    tag

    Talán megvan a hiba oka: ha megsemmisül egy játékegység, akkor lép ki a program - legalábbis úgy látom.
    A játékobjektumok példányainak van egy letezik boolean típusú tulajdonsága, ami false lesz, ha megsemmisül. Ezt mindig ellenőrzöm, hogy true vagy false, bármikor szóba kerül egy objektum.
    Amikor ciklussal végigmegyek a példányokon, ellenőrzöm, hogy létezik-e, ha meg nem, akkor jön a FreeAndNil (vagy a Delete, de azzal sem jó). Ha meg létezik, akkor jöhetnek vele a műveletek.
    De ilyen ciklusok nemcsak a pályafrissítés eljárásban, hanem sok másban is vannak velük, pl. a FormPaint-ben. De mindig leellenőrzöm, hogy létezik-e, ha műveletet végzek velük.
    Akkor ez most nem jó megoldás a példányok kezelésére, törlésére? Lehet, hogy a dinamikus tömb kezelése nem jó, ami tartalmazza őket? Vagy hogy kell ezt csinálni szabályosan?

    Nos, ha timer-rel frissíted "valamikor" a pályát MIKÖZBEN esetleg a törlések éppen zajlanak, az nem tűnik szerencsésnek. Itt valamilyen minimális szervezésnek illene lennie, pl. egy logikai változónak, hogy éppen "karbantartás" zajlik, ilyenkor a frissítés legyen blokkolva. A karbantartás végeztével a logikai változó megváltozásával ismét mehet a frissítés. Tehát a törlések UTÁN a megváltozott állapotra kell ráengedni a frissítést.

    Esetleg - ez még jobb - lehet 2 db logikai változó is, oda-vissza ellenőrzéssel, addig nincs frissítés, amíg karbantartás van, illetve addig nem kezdődik karbantartás, amíg zajlik a frissítés.

    Mondom ezt csak ötletként, a pontos kód ismerete nélkül, de amúgy lehet, hogy eddig is ez az egyidejűség okozta a problémádat.
    Ezek a változók lennének az ún. "szemafor"-ok, ennek van hagyománya a programozásban, és kb. ilyen esetekben használják őket, az egyidejűség elkerülésére, hogy ne legyen "karambol".

  • vz12
    tag

    Amúgy ennek a lehetőségnek mi értelme van a Projekt beállításai/Hibakeresés-ben:
    Hibakeresési információk létrehozása a GDB számára (lassabb / nagyobb exe-méret) ?
    Mert én ezt most kikapcsoltam, hogy ne legyen olyan óriási az EXE. De ha visszakapcsolnám és futtatnám az EXE-t, akkor rendesen kiírná a hibát vagy mi?

    Nem tudom, próbáld ki. :)
    Ha nem jön be, akkor majd visszakapcsolod.

  • Tomi_78
    aktív tag

    Talán megvan a hiba oka: ha megsemmisül egy játékegység, akkor lép ki a program - legalábbis úgy látom.
    A játékobjektumok példányainak van egy letezik boolean típusú tulajdonsága, ami false lesz, ha megsemmisül. Ezt mindig ellenőrzöm, hogy true vagy false, bármikor szóba kerül egy objektum.
    Amikor ciklussal végigmegyek a példányokon, ellenőrzöm, hogy létezik-e, ha meg nem, akkor jön a FreeAndNil (vagy a Delete, de azzal sem jó). Ha meg létezik, akkor jöhetnek vele a műveletek.
    De ilyen ciklusok nemcsak a pályafrissítés eljárásban, hanem sok másban is vannak velük, pl. a FormPaint-ben. De mindig leellenőrzöm, hogy létezik-e, ha műveletet végzek velük.
    Akkor ez most nem jó megoldás a példányok kezelésére, törlésére? Lehet, hogy a dinamikus tömb kezelése nem jó, ami tartalmazza őket? Vagy hogy kell ezt csinálni szabályosan?

  • Tomi_78
    aktív tag

    Amúgy ennek a lehetőségnek mi értelme van a Projekt beállításai/Hibakeresés-ben:
    Hibakeresési információk létrehozása a GDB számára (lassabb / nagyobb exe-méret) ?
    Mert én ezt most kikapcsoltam, hogy ne legyen olyan óriási az EXE. De ha visszakapcsolnám és futtatnám az EXE-t, akkor rendesen kiírná a hibát vagy mi?

  • Tomi_78
    aktív tag

    > "Cannot find bounds of current function"
    És van a függvénynek eleje/vége? El sem kellene indulnia a programnak, ha ilyen hiba van benne, ez az üzenet számomra nagyon furcsa, gyakorlatilag értelmezhetetlen.

    > F9-re is ezt írja ki
    Újraindítás után, MIELŐTT F9-et nyomnál, próbáld meg törölni az összes töréspontot:
    Nézet/Hibakereső ablakok/Töréspontok (Ctrl+Alt+B)
    Nyilván itt ki kellene jelölni az összes töréspontot, majd törlés.
    Ha utána sikeresen elindul, akkor - ha még nem ment el a kedved tőle - meg lehet próbálni a futtatást.
    A Shift+Ctrl+F9-cel a "Futtatás/Futtatás hibakeresés nélkül" esetén elvileg szintén nem szabadna annak a csúnya "Hibakereső Hiba" ablaknak megjelennie, hiszen nincs hibakeresés. De ez már lehet hogy egy Lazarus hozzáértő segítségét kívánja.
    Ha "megjavult", akkor ÉN nagyon óvatosan (messziről haladva, egyesével, vagy csupán csak 1-et) megpróbálnám újra felvenni a törésponto(ka)t.
    Akkor tudok ilyen hiba ablakot esetleg elképzelni, ha a töréspont a hiba UTÁN lett téve, és a hiba hatására valamilyen kezelhetelen állapotban beragadt a Lazarus.
    Bízom benne, hogy teljes újratelepítés NEM szükséges, mert az durva lenne.
    Sosem voltam ilyen helyzetben, tehát ezt nem tudom.

    Huhhh, úgy látszik, sikerült megtalálnom és eltávolítanom a töréspontot és most már elindul a program - persze a hibával együtt. Érdekes módon hibakeresés nélküli futtatáskor nem áll le...

  • vz12
    tag

    Na, most ezzel a töréspontozással sikerült teljesen futtathatatlanná tenni a programomat, mert F9-re is ezt írja ki:

    És hiába lépek ki majd indítom újra a Lazarus-t, mindig ez jön be. :F

    > "Cannot find bounds of current function"
    És van a függvénynek eleje/vége? El sem kellene indulnia a programnak, ha ilyen hiba van benne, ez az üzenet számomra nagyon furcsa, gyakorlatilag értelmezhetetlen.

    > F9-re is ezt írja ki
    Újraindítás után, MIELŐTT F9-et nyomnál, próbáld meg törölni az összes töréspontot:
    Nézet/Hibakereső ablakok/Töréspontok (Ctrl+Alt+B)
    Nyilván itt ki kellene jelölni az összes töréspontot, majd törlés.
    Ha utána sikeresen elindul, akkor - ha még nem ment el a kedved tőle - meg lehet próbálni a futtatást.
    A Shift+Ctrl+F9-cel a "Futtatás/Futtatás hibakeresés nélkül" esetén elvileg szintén nem szabadna annak a csúnya "Hibakereső Hiba" ablaknak megjelennie, hiszen nincs hibakeresés. De ez már lehet hogy egy Lazarus hozzáértő segítségét kívánja.
    Ha "megjavult", akkor ÉN nagyon óvatosan (messziről haladva, egyesével, vagy csupán csak 1-et) megpróbálnám újra felvenni a törésponto(ka)t.
    Akkor tudok ilyen hiba ablakot esetleg elképzelni, ha a töréspont a hiba UTÁN lett téve, és a hiba hatására valamilyen kezelhetelen állapotban beragadt a Lazarus.
    Bízom benne, hogy teljes újratelepítés NEM szükséges, mert az durva lenne.
    Sosem voltam ilyen helyzetben, tehát ezt nem tudom.

  • Tomi_78
    aktív tag

    Na, most ezzel a töréspontozással sikerült teljesen futtathatatlanná tenni a programomat, mert F9-re is ezt írja ki:

    És hiába lépek ki majd indítom újra a Lazarus-t, mindig ez jön be. :F

  • Tomi_78
    aktív tag

    Hű, köszönöm, Vz12, a gyors és alapos választ!
    Még tegnap ezt találtam a SIGSEG-vel kapcsolatban, amikor kerestem:
    [link]
    Be is kapcsoltam a kipipálható dolgokat a Hibakeresőben, és azután nem jelentkeztek a hibák. Csak hát én kipipálás nélkül is szeretném tudni az okokat és akkor is hibamentesnek szeretném tudni a programomat, nameg érteni azt, hogy mit pipáltam ki.
    Ma kivettem a jelölőnégyzetekből a pipákat és erre megint hibát dob fel egy kis idő után.
    A videót is köszönöm; még ma megnézem okvetlenül. És az F8-asozást is kipróbálom.

    Eddig ezt a hibaüzenetet sikerült kinyernem az F8-cal:
    "Cannot find bounds of current function".

  • Tomi_78
    aktív tag

    Hello!

    A pontos választ nem tudom, de gyors kereséssel az alábbi lehetséges okokat dobta a Google:

    If a program gets a segmentation fault (SIGSEGV), it references a memory address outside of the memory available to it.
    The most frequent causes for a segmentation fault are:
    An array index is outside the declared range.
    The name of an array index is misspelled.
    The calling routine has a REAL argument, which the called routine has as INTEGER.
    An array index is miscalculated.
    The calling routine has fewer arguments than required.
    A pointer is used before it is defined.

    Valószínűleg ezek csak példák, tehát lehetséges más ok is, de kiindulási alapnak talán elegendő.
    A debugolást tessék megtanulni, nagyon leegyszerűsíti a hibakeresést, a Delphi-ben a beépített debugger nagyon egyszerűen és kiválóan működik, a Lazarus-ban lévő pedig a képek alapján kb. ugyanaz lehet.
    Az első G-s találat a "debug in Lazarus"-ra ez, ránéztem, tök jó:
    [link]

    Egyébként ezt a hibát NEM biztos, hogy lehetséges könnyű megtalálni, mert ha pl. iterációban, időzített futásban, stb., tehát ha NEM az első ráfutáskor, hanem később "menet közben valamikor egyszercsak" jelentkezik a probléma, a változók változásai miatt, vagy ha a debugolás miatti megállások megváltoztatják a környezeti (idő) feltételeket, akkor bizony rá kell szánni az időt. És neked még azt is be kell határolni, hogy vajon HOVA kellene töréspontot tenni (ahol - még egyszer mondom - lehet hogy az első N db alkalommal akár minden rendben is van, tehát hiába állítod meg ott a programot, csak utána romlik el ugyanott "valamikor"). Először az F8-akat kellene nyomkodni, és ha megvan, hogy miben száll el, akkor (elölről kezdve) ugyanott F8 HELYETT F7-tel kellene OTT mélyebbre menni, ahol 1-gyel mélyebb szinten először szintén F8, utána F7. Amikor már nem lehet mélyebbre menni (F7), akkor megtaláltad a hibapontot, és kiakadás előtt meg kell vizsgálni a változók, objektumok, tömbök, stb. tartalmait akár ezek "watch"-olásával, akár az egér sima elem fölé húzásával, ahogy a fenti videóban is mutatják, és a kiírt értékek alapján NEKED már látnod kellene a problémát.

    A fentiek alapján MEGELŐZÉSSEL is lehetne kísérletezni, brutál validációkkal (kissé túl erőltetettnek tűnő IF-ezéssel) a tömb indexek és a mutatók/pointerek felhasználását tekintve. A rossz függvény paraméterezést kevéssé tartom valószínű oknak, azt talán "rendesen" is meg tudja mondani a Lazarus, de ki tudja.
    Esetleg (de ez csak ötlet) ha képernyő/pálya frissítésével függ össze a hiba, akkor LEHET, hogy a megadott frissítési idő kevés, ezért "összetorlódnak" a feladatok, amit már nem bír elviselni a rendszer, vagyis próbálkozni lehet a frissítés idejének megnövelésével is VAGY a pályaméret csökkentésével VAGY a frissítéskor lefutó kód gyorsításával, amennyiben az még nem optimális.

    Hű, köszönöm, Vz12, a gyors és alapos választ!
    Még tegnap ezt találtam a SIGSEG-vel kapcsolatban, amikor kerestem:
    [link]
    Be is kapcsoltam a kipipálható dolgokat a Hibakeresőben, és azután nem jelentkeztek a hibák. Csak hát én kipipálás nélkül is szeretném tudni az okokat és akkor is hibamentesnek szeretném tudni a programomat, nameg érteni azt, hogy mit pipáltam ki.
    Ma kivettem a jelölőnégyzetekből a pipákat és erre megint hibát dob fel egy kis idő után.
    A videót is köszönöm; még ma megnézem okvetlenül. És az F8-asozást is kipróbálom.

  • vz12
    tag

    Sziasztok!
    Azt szeretném megtudni, hogy Lazarus FreePascal-ban ha Assembly hibaüzenetet kapok, mint a mellékelt képen, akkor abból hogyan deríthetem ki, hogy az a forráskódban melyik sort jelenti?
    Sajnos a debugoláshoz egyáltalán nem értek, de a programom valami "External SIGSEGV osztályú kivétel" hibaüzenettel, majd az Assembly ablakkal áll le.

    Hello!

    A pontos választ nem tudom, de gyors kereséssel az alábbi lehetséges okokat dobta a Google:

    If a program gets a segmentation fault (SIGSEGV), it references a memory address outside of the memory available to it.
    The most frequent causes for a segmentation fault are:
    An array index is outside the declared range.
    The name of an array index is misspelled.
    The calling routine has a REAL argument, which the called routine has as INTEGER.
    An array index is miscalculated.
    The calling routine has fewer arguments than required.
    A pointer is used before it is defined.

    Valószínűleg ezek csak példák, tehát lehetséges más ok is, de kiindulási alapnak talán elegendő.
    A debugolást tessék megtanulni, nagyon leegyszerűsíti a hibakeresést, a Delphi-ben a beépített debugger nagyon egyszerűen és kiválóan működik, a Lazarus-ban lévő pedig a képek alapján kb. ugyanaz lehet.
    Az első G-s találat a "debug in Lazarus"-ra ez, ránéztem, tök jó:
    [link]

    Egyébként ezt a hibát NEM biztos, hogy lehetséges könnyű megtalálni, mert ha pl. iterációban, időzített futásban, stb., tehát ha NEM az első ráfutáskor, hanem később "menet közben valamikor egyszercsak" jelentkezik a probléma, a változók változásai miatt, vagy ha a debugolás miatti megállások megváltoztatják a környezeti (idő) feltételeket, akkor bizony rá kell szánni az időt. És neked még azt is be kell határolni, hogy vajon HOVA kellene töréspontot tenni (ahol - még egyszer mondom - lehet hogy az első N db alkalommal akár minden rendben is van, tehát hiába állítod meg ott a programot, csak utána romlik el ugyanott "valamikor"). Először az F8-akat kellene nyomkodni, és ha megvan, hogy miben száll el, akkor (elölről kezdve) ugyanott F8 HELYETT F7-tel kellene OTT mélyebbre menni, ahol 1-gyel mélyebb szinten először szintén F8, utána F7. Amikor már nem lehet mélyebbre menni (F7), akkor megtaláltad a hibapontot, és kiakadás előtt meg kell vizsgálni a változók, objektumok, tömbök, stb. tartalmait akár ezek "watch"-olásával, akár az egér sima elem fölé húzásával, ahogy a fenti videóban is mutatják, és a kiírt értékek alapján NEKED már látnod kellene a problémát.

    A fentiek alapján MEGELŐZÉSSEL is lehetne kísérletezni, brutál validációkkal (kissé túl erőltetettnek tűnő IF-ezéssel) a tömb indexek és a mutatók/pointerek felhasználását tekintve. A rossz függvény paraméterezést kevéssé tartom valószínű oknak, azt talán "rendesen" is meg tudja mondani a Lazarus, de ki tudja.
    Esetleg (de ez csak ötlet) ha képernyő/pálya frissítésével függ össze a hiba, akkor LEHET, hogy a megadott frissítési idő kevés, ezért "összetorlódnak" a feladatok, amit már nem bír elviselni a rendszer, vagyis próbálkozni lehet a frissítés idejének megnövelésével is VAGY a pályaméret csökkentésével VAGY a frissítéskor lefutó kód gyorsításával, amennyiben az még nem optimális.

  • Tomi_78
    aktív tag

    Sziasztok!
    Azt szeretném megtudni, hogy Lazarus FreePascal-ban ha Assembly hibaüzenetet kapok, mint a mellékelt képen, akkor abból hogyan deríthetem ki, hogy az a forráskódban melyik sort jelenti?
    Sajnos a debugoláshoz egyáltalán nem értek, de a programom valami "External SIGSEGV osztályú kivétel" hibaüzenettel, majd az Assembly ablakkal áll le.

  • vz12
    tag

    Köszi a választ, de egyelőre még nem jó. :(
    Az imént próbáltam ezzel is a FreeAndNil() helyett: delete(egysegek,edb,1); de hiába - bár most más Assembly utasítást dobott fel.
    A másik, bár kevésbé lényeges probléma, hogy ha ez a kóddarab van a FormPaint-ban:
    if egysegdb>0 then
              begin
                for edb:=0 to egysegdb-1 do
                begin
                  if egysegek[edb].letezik=true then
                  begin
                 if egysegek[edb].tulaj='jatekos' then
                      canvas.brush.Color:=clBlue
                   else
                       canvas.brush.Color:=clYellow;
                   radarobj.left:=2+Round(egysegek[edb].xhely / (palyakep.canvas.width / opanelkep.width+2));
                   radarobj.top:=radyeltol+Round(egysegek[edb].yhely / (palyakep.canvas.height / opanelkep.width+6));
                   radarobj.right:=radarobj.left+2;
                   radarobj.bottom:=radarobj.top+2;
                   canvas.rectangle(radarobj);
                  end;
                end;
    end;
    akkor miért mindig kék színű lesz a radarobj téglalap? Még a nem játékos irányította egységeknél is? Mert azoknál sárga kellene, hogy legyen.

    Ezt leginkább csak debug-olással lehet kideríteni, nálad.
    Legyen egy töréspont az "if"-en, és sor léptetésekkel haladva le kell kérdezgetni a kérdéses adatokat. A számítógépnek biztos, hogy igaza van, vagyis valahol valamilyen érték nem fog stimmelni, onnan kell majd tovább nyomozni.

  • Tomi_78
    aktív tag

    Köszi a választ, de egyelőre még nem jó. :(
    Az imént próbáltam ezzel is a FreeAndNil() helyett: delete(egysegek,edb,1); de hiába - bár most más Assembly utasítást dobott fel.
    A másik, bár kevésbé lényeges probléma, hogy ha ez a kóddarab van a FormPaint-ban:
    if egysegdb>0 then
              begin
                for edb:=0 to egysegdb-1 do
                begin
                  if egysegek[edb].letezik=true then
                  begin
                 if egysegek[edb].tulaj='jatekos' then
                      canvas.brush.Color:=clBlue
                   else
                       canvas.brush.Color:=clYellow;
                   radarobj.left:=2+Round(egysegek[edb].xhely / (palyakep.canvas.width / opanelkep.width+2));
                   radarobj.top:=radyeltol+Round(egysegek[edb].yhely / (palyakep.canvas.height / opanelkep.width+6));
                   radarobj.right:=radarobj.left+2;
                   radarobj.bottom:=radarobj.top+2;
                   canvas.rectangle(radarobj);
                  end;
                end;
    end;
    akkor miért mindig kék színű lesz a radarobj téglalap? Még a nem játékos irányította egységeknél is? Mert azoknál sárga kellene, hogy legyen.

    Na, most így sikerült kijavítanom:
    if egysegek[edb].letezik=false then
          begin
               delete(egysegek,edb,1);
               dec(egysegdb,1);
          end

    Bár az a gyanúm, hogy ez be fog kavarni kicsit, mert ha átrendeződik az egységek sorrendje, akkor a játékosé átkerülhet a számítógépéhez és fordítva, stb.
    Na mindegy, ez majd kiderül.
    De a radarobj miért kék még mindig? :O

  • Tomi_78
    aktív tag

    0. Meg kellene nézni (debug), hogy az "egysegek[edb]" véletlenül se legyen NULL. (valószínűleg nem az, de legyél teljesen biztos benne)

    1. Lehetne ezt a mintát követni, a "véletlen" problémák kivédése okán:
    if Assigned(x) then FreeAndNil(x);

    2. A fent említett mutatóra CAST-olnám a saját típusát, szintén csak a biztonság kedvéért, ez amúgy SOHASEM árt.
    / FreeAndNil(TDeklaráltTipus(egysegek[edb])); /

    3. Megpróbálnám ezt is, ez az "eredeti" pascal megoldás, 2 lépésből áll:
    dispose(TDeklaráltTipus(egysegek[edb]);
    egysegek[edb]:=nil;
    / Tudom, hogy a "FreeAndNil" is elvileg pontosan ezt csinálja, csak 1 lépésben, de azért gyakorlati tapasztalat szerzése céljából én kipróbálnám. /
    ---------------------
    Én a típuskényszerítéstől várnám a megoldást, mert a "sima Free" túl általánosnak tűnik, "mindenre" IS működnie kell, ezért valószínűleg sima "Pointer" vagy "TObject" hivatkozásokkal dolgozik.

    Köszi a választ, de egyelőre még nem jó. :(
    Az imént próbáltam ezzel is a FreeAndNil() helyett: delete(egysegek,edb,1); de hiába - bár most más Assembly utasítást dobott fel.
    A másik, bár kevésbé lényeges probléma, hogy ha ez a kóddarab van a FormPaint-ban:
    if egysegdb>0 then
              begin
                for edb:=0 to egysegdb-1 do
                begin
                  if egysegek[edb].letezik=true then
                  begin
                 if egysegek[edb].tulaj='jatekos' then
                      canvas.brush.Color:=clBlue
                   else
                       canvas.brush.Color:=clYellow;
                   radarobj.left:=2+Round(egysegek[edb].xhely / (palyakep.canvas.width / opanelkep.width+2));
                   radarobj.top:=radyeltol+Round(egysegek[edb].yhely / (palyakep.canvas.height / opanelkep.width+6));
                   radarobj.right:=radarobj.left+2;
                   radarobj.bottom:=radarobj.top+2;
                   canvas.rectangle(radarobj);
                  end;
                end;
    end;
    akkor miért mindig kék színű lesz a radarobj téglalap? Még a nem játékos irányította egységeknél is? Mert azoknál sárga kellene, hogy legyen.

  • vz12
    tag

    Megvan, miért jelenik meg a hiba, de sejtelmem sincs, hogy miért és hogyan oldható meg.
    Így törlöm a TEgysegek objektum egy példányát, ha már nem kell, mert a letezik változója hamisra állítódott:
    if egysegdb>0 then
     begin
       for edb:=0 to egysegdb-1 do
       begin
          if egysegek[edb].letezik=false then FreeAndNil(egysegek[edb])
          else

    Ezt az ellenőrzést a pályafrissítő időzítő futtatja le 25 időegységenként. De amikor bekövetkezik ez a FreeAndNil(), akkor dob ki hibával a program.
    Akkor nem is ezzel kellene példányt törölni? Próbáltam a Free-t meg a FreeInstance-t is, de mind hibát jelzett, mikor lefutottak.

    0. Meg kellene nézni (debug), hogy az "egysegek[edb]" véletlenül se legyen NULL. (valószínűleg nem az, de legyél teljesen biztos benne)

    1. Lehetne ezt a mintát követni, a "véletlen" problémák kivédése okán:
    if Assigned(x) then FreeAndNil(x);

    2. A fent említett mutatóra CAST-olnám a saját típusát, szintén csak a biztonság kedvéért, ez amúgy SOHASEM árt.
    / FreeAndNil(TDeklaráltTipus(egysegek[edb])); /

    3. Megpróbálnám ezt is, ez az "eredeti" pascal megoldás, 2 lépésből áll:
    dispose(TDeklaráltTipus(egysegek[edb]);
    egysegek[edb]:=nil;
    / Tudom, hogy a "FreeAndNil" is elvileg pontosan ezt csinálja, csak 1 lépésben, de azért gyakorlati tapasztalat szerzése céljából én kipróbálnám. /
    ---------------------
    Én a típuskényszerítéstől várnám a megoldást, mert a "sima Free" túl általánosnak tűnik, "mindenre" IS működnie kell, ezért valószínűleg sima "Pointer" vagy "TObject" hivatkozásokkal dolgozik.

  • Tomi_78
    aktív tag

    És az assembler hibákat hol lehet megnézni, hogy az a kódomban hol van, amikor SIGSEGV osztályú kivétel hibaüzenetet kapok?
    Ilyenkor csak megjelenik az Assembly-kódsor és nem tudok mit csinálni, csak hogy bezárom azt az ablakot. Az a baj, hogy gőzöm sincs, hogyan kell debuggolni...

    Megvan, miért jelenik meg a hiba, de sejtelmem sincs, hogy miért és hogyan oldható meg.
    Így törlöm a TEgysegek objektum egy példányát, ha már nem kell, mert a letezik változója hamisra állítódott:
    if egysegdb>0 then
     begin
       for edb:=0 to egysegdb-1 do
       begin
          if egysegek[edb].letezik=false then FreeAndNil(egysegek[edb])
          else

    Ezt az ellenőrzést a pályafrissítő időzítő futtatja le 25 időegységenként. De amikor bekövetkezik ez a FreeAndNil(), akkor dob ki hibával a program.
    Akkor nem is ezzel kellene példányt törölni? Próbáltam a Free-t meg a FreeInstance-t is, de mind hibát jelzett, mikor lefutottak.

  • Tomi_78
    aktív tag

    És az assembler hibákat hol lehet megnézni, hogy az a kódomban hol van, amikor SIGSEGV osztályú kivétel hibaüzenetet kapok?
    Ilyenkor csak megjelenik az Assembly-kódsor és nem tudok mit csinálni, csak hogy bezárom azt az ablakot. Az a baj, hogy gőzöm sincs, hogyan kell debuggolni...

  • vz12
    tag

    Fekete csík problémája is megoldva!
    Ugyanis - nem tudom, miért, de - ki kellett egészítenem a t2 téglalap beállításait annak left-top-right-bottom tulajdonságainak megadásával.
    Pedig azt hittem, a width-height is elég lesz, de úgy látszik, nem. :U

    Szuper!
    A kitartó kísérletezgetéssel rengeteg tapasztalatot lehet szerezni, ami tudássá tud alakulni és jó esetben még élvezi is az ember. :)

  • Tomi_78
    aktív tag

    Na, ez is sikerült: fehér színűvé tettem a .BMP képcsíkban a hátteret és transparent utasítás helyett a gpkatallkep[i].mask(clWhite);-ot alkalmaztam.
    Csak még az a baj, hogy - ahogy eddig is - az alképek bal oldalán egy fekete csík látható. Ezt hogy lehet eltüntetni? Lehet, hogy rossz értéket adtam meg a kép téglalapjának (Rect)? Próbáltam 0 helyett 1-et, 2-t, de ezekkel sem jó, pedig azt hittem, beljebb kéne kezdeni a ciklust ezen értékekkel.

    Fekete csík problémája is megoldva!
    Ugyanis - nem tudom, miért, de - ki kellett egészítenem a t2 téglalap beállításait annak left-top-right-bottom tulajdonságainak megadásával.
    Pedig azt hittem, a width-height is elég lesz, de úgy látszik, nem. :U

  • Tomi_78
    aktív tag

    A többi képem is .BMP és azokat mind átlátszóvá tudtam tenni. Lehet, hogy a mostani esetben máshová kellene tennem a transparent beállítását? Majd még kísérletezem...

    Na, ez is sikerült: fehér színűvé tettem a .BMP képcsíkban a hátteret és transparent utasítás helyett a gpkatallkep[i].mask(clWhite);-ot alkalmaztam.
    Csak még az a baj, hogy - ahogy eddig is - az alképek bal oldalán egy fekete csík látható. Ezt hogy lehet eltüntetni? Lehet, hogy rossz értéket adtam meg a kép téglalapjának (Rect)? Próbáltam 0 helyett 1-et, 2-t, de ezekkel sem jó, pedig azt hittem, beljebb kéne kezdeni a ciklust ezen értékekkel.

Új hozzászólás Aktív témák