Ebben a topikban 32 hsz-ből úgy legalább húsz az több mint évi 2-3. Ráadásul a kérdések jellege is azt mondatja velem, hogy akadna számára olyan terület, ahol a képességei jobban kamatoznának. Nekem egyébként tök mindegy, hogy mit csinál, én csak tanácsot adtam neki.
Sehogysem boldogulok a következő probléma megoldásával: adott egy ScrollBox-on egy TImage kép, aminek a tartalma és mérete változhat és a ScrollBox gyermekobjektuma. Erre a képre szeretnék kék rácsvonalakat rajzolni gombnyomásra, és szintén arra eltüntetni. De a kirajzolásnál mindig látszódik az erre a célra létrehozott újabb TImage alatt egy fekete téglalap (gondolom a vászna?). Hogyan lehetne csak a vonalakat megjeleníteni a képen?
Ezzel a kóddal próbálkoztam eddig:
procedure TForm1.tvracsrajzolas(Sender: TObject); var vszvonalhely,fugvonalhely: word; begin fugvonalhely:=csempeszel; vszvonalhely:=csempemag; //with tvracskep do // Ha ezek ki vannak kommentelve, a rács látszódik, //begin // de nem a tvracskep, hanem a Form1 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;
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(self); tvracskep.Parent:=tvScrBox; tvracskep.Left:=0; tvracskep.Top:=0; tvracskep.width:=terepVaszon.width; tvracskep.height:=terepVaszon.Height; //tvracskep.OnPaint:=@tvracsrajzolas; //tvracskep.Invalidate; tvracsrajzolas(tvracskep); end; vantvracs:=true; end; end;
Érdekes lenne, ha ilyesmik miatt 20-30 sornyi próbálkozásonként új nyelvvel próbálkozna az ember ... főleg, hogy kezdetben soronként több hiba jön szembe.
"Additionally, when using custom columns, the grids do not allow direct modification of grids.colcount; adding or removing columns should be done using the columns property. The explanation is that there is an inconsistency on gradually removing custom columns using ColCount, when ColCount reaches FixedCols, the grid has no more custom columns. If we now increase ColCount, the new column will not be a custom column but a normal column."
Úgy emlékszem (túl az idézett mondatokon), hogy oszlopokat egyesével lehet hozzáadni. Az oszlopdarabszám átírása ugyanis nem foglalja le az új oszlopok számára a memóriát. De nem vagyok ebben biztos; mindenesetre próbálkozz a fentebb javasolt columns metódussal.
Segítsetek már: Delphi 7.0-m van Win 10-es mellett! Delphi programomban Stringgridet szeretnék használni,de amikor a stringgrid értékadásához ér a program, Access violation hibaüzenettel leáll.
(Egy efféle tömbnektérképnekakkor volna értelme, ha regisztrálni akarnánk a vízcsepp által megtett útvonalat; úgymindig lenne egy, az aktuálisan érintettvízcsempét azonosító,összehasonlítható értékünk – amiként a vízcsepp koordinátái is, valós időben adottak.)
A pontosság érdekében nem csak a vízcsempék, hanem az azokat határoló 'fugák' méretei (...) sem mellékesek - amely adatok tárolására (még ha azok változnának is a folyamat során) pont megfelel egy/több, mindenkor érvényes tartalmú mátrix. Továbbá: definiálni kell, hogy az 1 pixelnél terjedelmesebb vízcsepp melyik képpontjaadja annak érvényes pozícióját; mi történjen akkor, ha e pozíció két vagy több vízcsempe között húzódó 'fuga'területére esik –feltéve, hogy a program nem zárja ki azt eleve, mondjuk a vízcsepp következő pozíciójának színkódját vizsgálva… ami ötletet adhat a szemmel nem érzékelhető, vízcsempénként eltérő színkódok alkalmazására; már ugye, a gyorsabb azonosítás érdekében – ha már mátrixok.:-)
Persze. A byte meg word ugye nem is lehet negatív, meg könnyen túlcsordulhatnak. Ezer éve nem Delphizek, már nem emlékszem a compiler pontosan hogy csinálja, de én inkább nem szórakoznék ilyenekkel.
Áruld már el, hogy az a két if minek?
Elegánsan ez a kód kb. ennyi lenne:
function utkvizzel(xh: integer; yh: integer): boolean; begin if mostterkep[yh div vizmag, xh div vizszel]=1 then Result:=true else Result:=false; end;
Ha különböző méreteket akarsz, akkor aztán teljesen más logika kell. Az már haladó szint. :)
Akkor a típusátalakítások (ha jól tudom, ezt nevezik cast-olásnak) is okozhatnak galibát a kapott értékben?
Egyébként most találtam egy hellyel-közzel jól működő megoldást a problémámra:
function utkvizzel(xh: integer; yh: integer): boolean; var ktxh,ktyh: integer; begin if xh<vizszel then ktxh:=0 else begin ktxh:=xh div vizszel; end; if yh<vizmag then ktyh:=0 else begin ktyh:=yh div vizmag; end; if mostterkep[ktyh,ktxh]=1 then utkvizzel:=true else utkvizzel:=false; end;
amelyben a vizszel és vizmag a vízcsempe szélessége és magassága. Persze ez bizonyára nem lesz jó azokban az esetekben, amikor különböző méretű csempék vannak a pályán, de most még ez megfelel nekem.
Van ugyan egy oldalpanel, ami 128 képpont széles, de ezt sem hozzáadva, sem kivonva nem segít, ráadásul függőlegesen nincs semmi, tehát az az irányú rendellenes eltolódásra ez nem magyarázat.
Ugyanazt a koordináta-rendszert használod mindenhol? Pl. ha xh=0, yh=0 a képernyő bal felső sarka, a térképed bal felső sarka is abban a pozícióban van? Ha nem, akkor egyiket transzformálnod kell a másikba. Az osztás ilyenkor kevés.
Szeretném tőletek megtudni, hogy ha van egy ilyen alakú térképem:
var terkep: array [0..8,0..8] of byte=( (0,0,0,1,0,0,0,0,0), (0,2,0,1,0,0,3,0,3), (0,0,1,1,1,0,0,0,0), (0,3,1,0,1,0,3,0,0), (0,0,1,0,1,0,0,3,0), (0,0,1,1,1,0,3,0,0), (0,3,0,0,0,3,0,3,0), (0,0,0,1,0,0,0,0,0), (0,0,0,1,0,0,0,0,0) );
amelyen az 1-es szám a mellékelt képen látható akadályt (vízcsempe) mutatja, akkor a rendes, ennek alapján létrehozott nagy képen mozgó objektum aktuális koordinátái alapján hogyan tudható meg, hogy az éppen az 1-es csempén van-e vagy sem?
Most ezzel a kóddarabbal számítom az elhelyezkedést a terkep-en (a mostterkep-be betöltve), de ez nem jó, mert csak nagyjából adja a helyes koordinátát, és részben belemegy a vízcsempékbe, mintha azok jobbra és lefelé el lennének tolva egy kicsit:
function utkvizzel(xh: integer; yh: integer): boolean; var ktxh,ktyh: integer; begin if xh<(palyakep.width / tkszel) then ktxh:=0 else begin ktxh:=round(xh / (palyakep.width / tkszel)); //if ktxh>=1 then ktxh:=ktxh-1; end; if yh<(palyakep.height / tkmag) then ktyh:=0 else begin ktyh:=round(yh / (palyakep.height / tkmag)); //if ktyh>=1 then ktyh:=ktyh-1; end; if mostterkep[ktyh,ktxh]=1 then utkvizzel:=true else utkvizzel:=false; end;
Próbálkoztam a round-on kívül ceil-lel, floor-ral, trunc-cal, de csak rontottam a helyzeten. A round a legpontosabb ezek közül, de még ez sem eléggé.
Tehát ahol a képen látható a sárga kör, az az 1 és 2 YX koordináta kellene legyen a terkep-en (0-tól indul ugyebár). De ha azt round-dal kerekítem, akkor 2-2 lesz az Y koord és X koord, amint a legfelső kiírás is mutatja.
Szóval nem tudom belőni a megfelelő helyet neki és már semmi ötletem sincs hozzá.
Inkább foglalkozz valami mással. Int 10h meg hasolók valós időben, DOS alatt érhetők el, mivel a BIOS részei ezek a rutinok. BIOS meg védett módban egy nem létező fogalom. A win/linux az ugyanis védett módú opre.
A te bajodra egy pointer-es, scanline-os megvalósítás lenne az orvosság.