AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Benötige Hilfe beim Entwickeln einer Komponente
Thema durchsuchen
Ansicht
Themen-Optionen

Benötige Hilfe beim Entwickeln einer Komponente

Ein Thema von torud · begonnen am 29. Aug 2007 · letzter Beitrag vom 17. Jul 2013
Antwort Antwort
Seite 11 von 13   « Erste     91011 1213      
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#101

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 8. Sep 2007, 02:59
Delphi-Quellcode:
SetWindowRgn(Handle, Region, True);
DeleteObject(Region);
Das Region Handle nach einer Zuweisung mit MSDN-Library durchsuchenSetWindowRgn nicht mehr verwenden oder gar löschen

Im MSDN steht geschrieben:
After a successful call to SetWindowRgn, the operating system owns the region specified by the region handle hRgn. The operating system does not make a copy of the region. Thus, you should not make any further function calls with this region handle. In particular, do not close this region handle.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#102

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 8. Sep 2007, 09:38
Danke für die info. Gelöscht wird es ja, aber es wird komischerweise in dem Code nach dem Löschen noch einmal verwendet. Bei mir funzt es jedenfalss nicht. Warum auch immer.
Danke
Tom
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#103

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 8. Sep 2007, 14:01
Um das noch mal in Erinnerung zu bringen, hier der Code den ich gepostet habe
Delphi-Quellcode:
procedure TMyControl.DoInvisible;
begin
  //gesamten Clientbereich erfassen
  if FullRgn <> 0 then
    DeleteObject(FullRgn);
  FullRgn := CreateRectRgn(0, 0, Width, Height);
  //'Mask' alles unsichtbar
  CombineRgn( FullRgn, FullRgn, FullRgn, RGN_DIFF );

  // alle sichtbaren Bereiche einblenden
  PointRgn := CreateRectRgn( X, Y, Width, Hight); // das ist ein Bereich im Rect der eingeblendet wird
  CombineRgn( FullRgn, FullRgn, PointRgn, RGN_OR );
  DeleteObject(Pointrgn);

  // alles Kombiniert und fertig
  SetWindowRgn(Handle, FullRgn, TRUE);
end;
Hier wird nirgens der FullRgn nach SetWindowRgn angefaßt!

Das einzige, was gelöscht wird ist PointRgn. PointRgn wird aber nur für die Kombination der Sichtbaren Bereiche(PointRgn; heisst bei mir so, weil das Rect-Bereiche von Eckpunkten sind) auf den FullRange verwendet. Das dann in einer Schleife.

Ob in meinem ersten Bereich das DeleteObject auf FullRange jetzt korrekt ist, keine Ahnung, bin ich jetzt auch etwas unsicher. Dort wird auf jeden Fall erst mal das ganze Control/Form unsichtbar gemacht.

Im mittleren Abschnitt werden alle sichtbaren Bereiche auf FullRgn kombiniert und im letzten Abschnitt alles gesetzt.

Das was Tom macht ist den letzten Teil meines (auch hier dem Forum entlehnt) Codes herauszunehmen. Der Anfangs- und Mittelteil fehlt völlig und der Rest ist inkorrect!

Kein Wunder, dass nichts mehr geht.

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#104

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 8. Sep 2007, 14:22
Zitat von oki:
Delphi-Quellcode:
procedure TMyControl.DoInvisible;
begin
  //gesamten Clientbereich erfassen
  if FullRgn <> 0 then
    DeleteObject(FullRgn);
  FullRgn := CreateRectRgn(0, 0, Width, Height);
  //'Mask' alles unsichtbar
  CombineRgn( FullRgn, FullRgn, FullRgn, RGN_DIFF );

  // alle sichtbaren Bereiche einblenden
  PointRgn := CreateRectRgn( X, Y, Width, Hight); // das ist ein Bereich im Rect der eingeblendet wird
  CombineRgn( FullRgn, FullRgn, PointRgn, RGN_OR );
  DeleteObject(Pointrgn);

  // alles Kombiniert und fertig
  SetWindowRgn(Handle, FullRgn, TRUE);
end;
Ich weiß jetzt nicht, wo Du FullRgn deklariert hast, ich nehme mal an als Private, aber wenn Du DoInvisible mehr als 1 x aufrufst löscht Du das Region Handle nach SetWindowRgn...

Delphi-Quellcode:
// 1. Aufruf, FullRgn = 0 (vermutlich)
procedure TMyControl.DoInvisible;
begin
  //gesamten Clientbereich erfassen
  if FullRgn <> 0 then
    DeleteObject(FullRgn);
  ...
  // alles Kombiniert und fertig
  SetWindowRgn(Handle, FullRgn, TRUE);
end;
Delphi-Quellcode:
// 2. Aufruf, FullRgn <> 0, wurde mit SetWindowRgn gesetzt, wird aber gelöscht
procedure TMyControl.DoInvisible;
begin
  //gesamten Clientbereich erfassen
  if FullRgn <> 0 then
    DeleteObject(FullRgn);
   ...
  // alles Kombiniert und fertig
  SetWindowRgn(Handle, FullRgn, TRUE);
end;

Richtig wäre:
Delphi-Quellcode:
procedure TMyControl.DoInvisible;
   var FullRgn:HRgn;
begin
  FullRgn := CreateRectRgn(0, 0, Width, Height);
  //'Mask' alles unsichtbar
  CombineRgn( FullRgn, FullRgn, FullRgn, RGN_DIFF );

  // alle sichtbaren Bereiche einblenden
  PointRgn := CreateRectRgn( X, Y, Width, Hight); // das ist ein Bereich im Rect der eingeblendet wird
  CombineRgn( FullRgn, FullRgn, PointRgn, RGN_OR );
  DeleteObject(Pointrgn);

  // alles Kombiniert und fertig
  SetWindowRgn(Handle, FullRgn, TRUE);
  // FullRgn nicht mehr antasten
end;
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#105

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 8. Sep 2007, 14:46
Hi Sunlight7,

richtig, FullRgn ist privat deklariert.

Nun ist es aber doch so, dass bei einem CreateRectRgn ein handle erzeugt und somit Speicher reserviert wird. Wenn sich das Aussehen oder die Größe ändert, dann muß der Range ja neu gesetzt werden.
Rufe ich nun für FullRgn ein weiteres Mal CreateRectRgn auf, so wird imho doch ein neues Handle erzeugt und neuer Speicher reserviert. Damit würde ich dann doch ohne DeleteObject auf das alte Handle ein Speicherleck erzeugen. Oder nicht?

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#106

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 8. Sep 2007, 14:56
Hi Oki,

Nein wüdest Du nicht, da sich das OS bei einem Aufruf von SetWindowRgn das Handle und alles damit verbundene unter die Finger krallt und sich auch um die Entsorgung kümmert, wenn es nicht mehr gebraucht wird.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#107

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 8. Sep 2007, 15:05
Das heißt dann auch, dass das Handle für die PointRgn nicht mit DeleteObject frei gegeben werden muß?

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#108

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 8. Sep 2007, 15:19
Nein, denn das gilt nur für Region Handles, die mit Delphi-Referenz durchsuchenSetWindowRgn einem Fenster zugewiesen werden.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#109

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 8. Sep 2007, 17:48
Hi Sunlight7,

ich glaub dir das schon, aber ein komisches Gefühl hab ich dabei doch. Denn wenn ich für die Variable FullRgn die mein mit SetWindowRgn zugewiesenes Handle enthält eine neue Zuweisung mit CreateRectRgn tätige, wird das enthaltene Handle doch überschrieben. Oder wird das alte Handle bei der Zuweisung des neuen mit SetWindowRgn vom OS frei gegeben?

Gruß oki
42
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#110

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 8. Sep 2007, 18:08
Also als Beispiel:

Delphi-Quellcode:
procedure TMyControl.Foo;
   var Rgn1, Rgn2:HRgn;
begin
  Rgn1:=CreateRectRgn(0, 0, Width, Hight);
  SetWindowRgn(Handle, Rgn1, TRUE);
  // Jetzt hat das OS die Kontrolle über das Handle in Rgn1

  Rgn2:=CreateRectRgn(0, 0, Width, Hight);
  SetWindowRgn(Handle, Rgn2, TRUE);
  // Jetzt hat das OS die Kontrolle über das Handle in Rgn2 und Rgn1 wurde gelöscht

  SetWindowRgn(Handle, 0, TRUE);
  // Und nu is auch Rgn2 gelöscht
end;
Edit: Fehler ausgebessert
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 11 von 13   « Erste     91011 1213      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz