![]() |
kann Daten nicht an Rect übergeben
Warum ist das nicht möglich bzw.. was ist falsch
Delphi-Quellcode:
pData :PRgnData;
lpRect : PRect;
Delphi-Quellcode:
gruss Emil
lpRect := sizeof(RgnDataHeader) + pData^.rdh;
lpRect := lpRect + sizeof(TRect); |
Re: kann Daten nicht an Rect übergeben
Was kommt denn für eine Fehlermeldung? Und wo reservierst du Speicher für lpRect?
|
Re: kann Daten nicht an Rect übergeben
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
In PBasic schreib ich es so und hab kein problem damit
Delphi-Quellcode:
Sieht jetzt so aus :)
lpRect = LEN(RGNDATAHEADER) + rdh
lpRect = lpRect + LEN(RECT) Leider durch das problem sind die ecken Magenta (vorher gesetzt) werden aber nicht transparent geschaltet. gruss Emil |
Re: kann Daten nicht an Rect übergeben
In delphi musst du casten. lpRect ist ein Pointer, sizeof ein Integer/Cardinal und rdh?
Einem Pointer kannst du nicht einfach einen Integer zuweisen da muss ein Cast hinn. Und Pointer kann man nicht einfach addieren, da muss auch ein Cast hinn. das weiterrücken des rect geht so:
Delphi-Quellcode:
//lpRect := lpRect + sizeof(TRect);
inc(lpRect); |
Re: kann Daten nicht an Rect übergeben
Zitat:
Wie sieht denn der Cast aus ? rdh =:
Delphi-Quellcode:
Grrmmm immer diese Typen umwandlungen. ;)
PRgnData = ^TRgnData;
{$EXTERNALSYM _RGNDATA} _RGNDATA = record rdh: TRgnDataHeader; Buffer: array[0..0] of CHAR; Reserved: array[0..2] of CHAR; end; gruss Emil |
Re: kann Daten nicht an Rect übergeben
Liste der Anhänge anzeigen (Anzahl: 1)
Kann mal bitte jemand drüberschaun?
Bekomme einfach meine Kanten nicht rund
Delphi-Quellcode:
gruss Emil
procedure TSkinEngine.CreateFormRegion(TransColor: COLORREF);
var bm : Bitmap; pData : PRgnData; lpRect : PRect; hRgn1 : HRGN; hRgn2 : HRGN; sRegionData : THANDLE; TT : Integer; MaxRegions : Integer; hDIB : Cardinal; I, J, K, M : Integer; IsSame : Integer; bRedraw : Boolean; Ar: array of PRGBQuad; begin hDIB := GetPaintBitmap(MainWindow(0)); if hDIB = 0 then exit; MaxRegions := 4000; GetObject(hDIB, SIZEOF(bm), @bm); SetLength(Ar, integer(bm.bmBits)); Ar := @bm.bmBits; if TransColor = 0 then TransColor := Cardinal(Ar[(bm.bmHeight - 1) * bm.bmWidth]) and $FFFFFF; sRegionData := GlobalAlloc(GMEM_MOVEABLE, sizeof(RGNDATAHEADER) + (sizeof(TRECT) * MaxRegions)); pData := GlobalLock(sRegionData); pData^.rdh.nCount := MaxRegions + 1;; pData^.rdh.dwSize := sizeof(RGNDATAHEADER); pData^.rdh.iType := RDH_RECTANGLES; pData^.rdh.rcBound.Left := 0; pData^.rdh.rcBound.Top := 0; pData^.rdh.rcBound.Right := bm.bmWidth; pData^.rdh.rcBound.Bottom := bm.bmHeight; lpRect:= PRECT(@pData^.Buffer); for J := 0 TO bm.bmHeight - 1 do begin TT := bm.bmWidth * (bm.bmHeight - 1 - J); M := -1; for I := 0 TO bm.bmWidth do begin if I = bm.bmWidth then K := TransColor else K := Cardinal(@Ar[TT]) and $FFFFFF; TT := TT + 1; if K = integer(TransColor) then IsSame := -1 else IsSame := 0; if IsSame = 0 then if M = -1 then M := I else if M >= 0 then begin if integer(pData^.rdh.nCount) >= MaxRegions then begin hRgn2 := ExtCreateRegion(nil, sizeof(RGNDATAHEADER) + (sizeof(TRECT) * pData^.rdh.nCount), PRGNDATA(pData)^); if hRgn1 = 0 then begin hRgn1 := hRgn2; end else begin CombineRgn(hRgn1, hRgn1, hRgn2, RGN_OR); zDeleteObject(hRgn2); end; pData^.rdh.nCount := 0; end; inc(pData^.rdh.nCount); lpRect.Left := M; lpRect.Right := I; lpRect.Top := J; lpRect.Bottom := J + 1; inc(lpRect); M := -1; end; end; end; hRgn2 := ExtCreateRegion(nil, sizeof(RGNDATAHEADER) + (sizeof(TRECT) * pData^.rdh.nCount), pData^); if hRgn1 = 0 then begin hRgn1 := hRgn2 end else begin CombineRgn(hRgn1, hRgn1, hRgn2, RGN_OR); DeleteObject(hRgn2); end; if hRgn1 <> 0 then begin if IsWindowVisible(MainWindow(0)) then bRedraw := TRUE else bRedraw := FALSE; SetWindowRgn(MainWindow(0), hRgn1, bRedraw); end; SetLength(Ar, 0); end; |
Re: kann Daten nicht an Rect übergeben
Delphi-Quellcode:
Wozu reservierst du Speicher bei dem Array, wenn du es dann einfach überschreibst bzw. die Adresse woanders hinzeigen lässt? Was soll das mit dem "Array of TRGBQuad" überhaupt?
SetLength(Ar, integer(bm.bmBits));
Ar := @bm.bmBits; bmBits gibt dir den Zeiger auf einen TRGBQuad zurück, sprich: bmBits ist eigentlich ein PRGBQuad. Alle nachfolgenden Pixel findest du dann nach dem diesem Pixel. Dazu (wurde schon beim PRect gesagt) einfach Inc() machen. Also:
Delphi-Quellcode:
var
lPixel: PRGBQuad; begin lPixel := bm.bmBits; lPixel^ => 1. Pixel Inc(lPixel); lPixel^ => 2. Pixel etc |
Re: kann Daten nicht an Rect übergeben
Zitat:
REDIM Ar(0) AS LONG AT bm.bmBits Da ist nichts mit Quads Mein problem ist halt eine lösung für mich zu finden die Daten nach Delphi rüber zu bringen will aber auch nicht meine Progr.. die anderen vielleicht noch von nutzen sein können in die Tonne werfen nur weil ich jetzt nix mehr in basic mache. Jo in Delphi ist der ersatz für 1 = 1 + 1 inc(1) hab ich schon verstanden. Was ich auf jedenfall weis ist das mein PB Schnipsel funktioniert. Danke für die Hilfe. PS: Häng mal mein Org. mit an
Delphi-Quellcode:
SUB CreateFormRegion(BYVAL TransColor AS LONG)
//schnipp END SUB |
Re: kann Daten nicht an Rect übergeben
Zitat:
Du hast ein dynamisches Array und das zeigt auf den reservierten Speicherbereich mit der in SetLength() angegebenen Grösse. Die deklarierte Variable deines Arrays ist dabei ein Zeiger, welcher durch SetLength(), wie zuvor beschrieben, initialisiert wurde. Mit deiner Zuweisung von dmBits auf die Array Variable lässt du die Variable (den Pointer im Endeffekt) nicht mehr auf das Array sondern auf deine Pixeldaten zeigen. Das reservierte Array liegt dann immernoch an seiner Original-reservierten Position im Speicher und ist verloren, da du mit der Zuweisung die letzte Zugriffsmöglichkeit zerschossen hast. Da die Dimensionierung aber vor dem Array im Speicher liegt, auf den der Zeiger mal original hingezeigt hat und dein Pixeldaten keine solche Informationen vor dem ersten Pixel hat, ist die Dimensionierung hinfällig. Ich hoffe du verstehst nun meine Einwände... Zitat:
Dein Weg:
Delphi-Quellcode:
Mein Vorschlag:
var
lPixel: PLongWord; begin lPixel := bm.bmBits; Red := lPixel^ and $ff; Green := (lPixel^ shr 8) and $ff; Blue := (lPixel^ shr 16) and $ff; Alpha := (lPixel^ shr 24) and $ff;
Delphi-Quellcode:
Ich find mein Code lesbarer - aber Vorsicht: Subjektive Meinung!
var
lPixel: PRGBQuad; begin lPixel := bm.bmBits; Red := lPixel^.rgbRed; Green := lPixel^.rgbGreen; Blue := lPixel^.rgbBlue; Alpha := lPixel^.rgbReserved; Zitat:
Zitat:
Inc() auf ordinale Typen macht das von dir beschriebene. Inc() auf typisierte Zeiger macht was anderes. Der macht auch mal +2 oder +x - abhängig vom Pointer. Wenn der typisierte Pointer mit Inc() oder Dec() verändert wird, dann wird der Pointer jeweils um die Grösse des Typs verschoben. Also (um auf dein Beispiel zurück zu kommen):
Delphi-Quellcode:
Und wenn wir uns das ganze nun nochmal mit einem PRGBQuad anschauen:
var
lPixel: PLongWord; begin lPixel := Addr($1000); Inc(lPixel); // hier ist lPixel ein Zeiger auf die Adresse $1004 !!! lPixel := Addr($1000); Inc(lPixel, 2); // hier ist lPixel ein Zeiger auf die Adresse $1008 end;
Delphi-Quellcode:
Kein Unterschied von dem Adresshandler, da der Typ, auf den der Zeiger zeigt, gleich gross ist.
var
lPixel: PRGBQuad; begin lPixel := Addr($1000); Inc(lPixel); // hier ist lPixel ein Zeiger auf die Adresse $1004 !!! lPixel := Addr($1000); Inc(lPixel, 2); // hier ist lPixel ein Zeiger auf die Adresse $1008 end; Oder allgemein formuliert: Bei Inc() und Dec() auf typisierte Zeiger gilt: Inc/Dec(p, x): p := p +/- x * sizeof(p^); Aber egal, ich weiss nun, ich werde lieber nichts eigenmächtig verbessern oder ersetzen sollte in deinen Codes. Und ich hoffe du weisst nun, dass man dir nicht immer in die Suppe spucken will. Fremde Programmiersprachen zu lesen und zu verstehen ist nicht immer schwierig, da das Prinzip der meisten gleich ist, nur die Syntax ist anders. |
Re: kann Daten nicht an Rect übergeben
Das ist wirklich eine sehr gute beschreibung meines problems.
Grundsätzlich bin ich immer dafür etwas zu vereinfachen wenn ich mir unnötige zwischen berechnungen ersparen kann werd ich das natürlich tun. Warum also nochmal konvertieren (berechnen) "shl" wenn die Daten schon im speicher bereit liegen. Da sehe ich auch keinen sinn drin. Würde dann auch lieber auf die lösung von dir zugreifen.
Delphi-Quellcode:
Ist was schwierig die ganze Funktionsbreite von Delphi auszunutzen.
var
lPixel: PRGBQuad; begin lPixel := bm.bmBits; Red := lPixel^.rgbRed; Green := lPixel^.rgbGreen; Blue := lPixel^.rgbBlue; Alpha := lPixel^.rgbReserved; Aber wird schon. Zitat:
BIn immer froh wenn mir jemand hilft und ich das auch zurückgeben kann. Danke gruss Emil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz