Autor Beitrag
JDKDelphi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 115
Erhaltene Danke: 22

WIN2000, XP, WIN 7 , UNIX, LINUX
Assembler für (Z8x, 68xxx,R6000,Intel), DELPHI 6 Enterprise, MAGIC eDeveloper V9+V10, C++, C#,VB, .NET, zertifizierter iBOLT-Programmierer
BeitragVerfasst: Mi 18.08.10 14:58 
Hallo Delphi-Freunde,

ich habe folgendes Problem:

Ein von mir entwickeltes Steuerelement erlaubt ein Verschieben von Polygonen innerhalb einer Bitmap.Canvas.
Das Steuerelement besteht aus einer Scrollbox mit einem Image. Zweck dieses Steuerelemntes ist, datenbankunabhängig
Polygone zu plazieren und zu bearbeiten. Das ganze funktioniert auch schön und als OCX ist das nun auch verfügbar.
Wir binden das in unserem ERP-System(Betonverarbeitung) ein, um Produktionsplanung zur Verfügung zu stellen.

Ein kleiner Schönheitsfehler ist, das wenn ich etwas interaktiv verschiebe, die ganze Grafik flimmert.

Wie kann ich "REPAINT" "Inavalidate" etc. im Moment der Verschiebeaktion unterbinden?

Vielleicht habt Ihr einen schnellen Tip auf lager.


Vielen Dank

und

Gruß

_________________
Wo andere aufhören, fange ich erst an..
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: Mi 18.08.10 15:08 
yep, double buffering ist der trick..

du zeichnest das bild auf eine graphik im speicher, und in regelmäsigen abständen zeichnest du die graphik dann auf das formular oder sontswohin.
nicht vergessen die graphik vor jeden neuen bezeichnen "freizuräumen" also mit weiß füllen oder so
JDKDelphi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 115
Erhaltene Danke: 22

WIN2000, XP, WIN 7 , UNIX, LINUX
Assembler für (Z8x, 68xxx,R6000,Intel), DELPHI 6 Enterprise, MAGIC eDeveloper V9+V10, C++, C#,VB, .NET, zertifizierter iBOLT-Programmierer
BeitragVerfasst: Mi 18.08.10 15:10 
Danke.

Das hatte ich auch schon gedacht.
Allerdings braucht das Steuerelement ganz schön viel Speicher.
Gibts da nicht noch einen Trick, das Neuzeichnen vom Betriebssystem einfach zu unterdrücken und nur bei Ende der Operation aufzurufen?

_________________
Wo andere aufhören, fange ich erst an..
JDKDelphi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 115
Erhaltene Danke: 22

WIN2000, XP, WIN 7 , UNIX, LINUX
Assembler für (Z8x, 68xxx,R6000,Intel), DELPHI 6 Enterprise, MAGIC eDeveloper V9+V10, C++, C#,VB, .NET, zertifizierter iBOLT-Programmierer
BeitragVerfasst: Mi 18.08.10 15:15 
Bei TImage gibt's leider keine Property Doublebufferd

Die kommt nur bei TWinControl

_________________
Wo andere aufhören, fange ich erst an..
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: Mi 18.08.10 15:34 
paint message von abfangen und nur zeichnen wenn erwünscht?
JDKDelphi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 115
Erhaltene Danke: 22

WIN2000, XP, WIN 7 , UNIX, LINUX
Assembler für (Z8x, 68xxx,R6000,Intel), DELPHI 6 Enterprise, MAGIC eDeveloper V9+V10, C++, C#,VB, .NET, zertifizierter iBOLT-Programmierer
BeitragVerfasst: Mi 18.08.10 15:43 
Danke.

Wäre ja schön, wenn das auch bei onMouseMove(..) geht.
Wie gesagt, ein markiertes Objekt soll verschoben werden. Zur Anzeige nutze ich DrawFocusRect(..).
Vorher wird das umschließende Rechteck der Grafik ermittelt, damit der User die Umrisse sieht.

Ich poste hier mal kurz Code:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
procedure TLane.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
var apos    : Tpoint;
    iRec    : TRect;
begin
  if ssleft in Shift THEN
  BEGIN
    //
    IF fmouseact = madraw THEN
    BEGIN
      image1.Canvas.DrawFocusRect(rect(fp_ol.X,fp_ol.Y,fp_ur.X,fp_ur.Y));
      image1.Canvas.DrawFocusRect(rect(fp_ol.X,fp_ol.Y,X,Y));
    END;
    //
    IF fmouseact = mamove THEN
    BEGIN
      IF fAktiveObj < 0 THEN
      BEGIN
        image1.Canvas.Brush.Color := clWhite;
        image1.Canvas.Pen.Color := clBlack;
        image1.Canvas.DrawFocusRect(fmfokus);
      //
        fp_ol.X := x;  fp_ol.Y := y;
        fmfokus.TopLeft := fp_ol;
        apos.X := fm_rect.Right+fp_ol.X;
        apos.Y := fm_rect.Bottom + fp_ol.Y;
        fmfokus.BottomRight := apos;
        fmfokus := srect(fmfokus);
        image1.Canvas.Pen.Color := clBlack;
        image1.Canvas.DrawFocusRect(fmfokus);
      END
      ELSE
      BEGIN
        image1.Canvas.Brush.Color := clWhite;
        image1.Canvas.Pen.Color := clBlack;
        image1.Canvas.DrawFocusRect(fmfokus);
        fp_ol.X := x;  fp_ol.Y := y;
        irec  := fworkobjekt.PrepareDrawRect;
        fmfokus.TopLeft := fp_ol;
        apos.X := irec.Right + fp_ol.X;
        apos.Y := irec.Bottom + fp_ol.Y;
        fmfokus.BottomRight := apos;
        fmfokus := srect(fmfokus);

        image1.Canvas.Pen.Color := clBlack;
        image1.Canvas.DrawFocusRect(fmfokus);
      END;
    END;
    fp_ur.X := x;  fp_ur.Y := y;
  END;
end;


Das ganze Steuerelement besteht aus ca. 5500 Zeilen Code.
Nur dieser kleine Schönheitsfehler, den würde ich ganz gerne mal wegbekommen.

Danke nochmals

_________________
Wo andere aufhören, fange ich erst an..
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: Mi 18.08.10 15:45 
dann wirst du wohl um eine graphik im speicher nicht drumm herum kommen
JDKDelphi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 115
Erhaltene Danke: 22

WIN2000, XP, WIN 7 , UNIX, LINUX
Assembler für (Z8x, 68xxx,R6000,Intel), DELPHI 6 Enterprise, MAGIC eDeveloper V9+V10, C++, C#,VB, .NET, zertifizierter iBOLT-Programmierer
BeitragVerfasst: Mi 18.08.10 15:52 
Ich glaube auch.

Im Anhang findet Ihr mal ein PDF, wie das ganze im ERP-System aussieht

Grüße
Einloggen, um Attachments anzusehen!
_________________
Wo andere aufhören, fange ich erst an..
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Mi 18.08.10 16:19 
Das DoubleBuffered musst du bei der Form1 auf true setzen, das gilt dann Programmweit...

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 18.08.10 16:51 
user profile iconplatzwart hat folgendes geschrieben Zum zitierten Posting springen:
Das DoubleBuffered musst du bei der Form1 auf true setzen, das gilt dann Programmweit...

So stimmt das glaub ich nicht ganz. Allerdings ist das wohl die einfachste Realisierung, nur musst du:

user profile iconJDKDelphi hat folgendes geschrieben Zum zitierten Posting springen:
Das Steuerelement besteht aus einer Scrollbox mit einem Image.


ScrollBox.DoubleBuffered:=True; setzen. (falls das Image da drin liegt)

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
JDKDelphi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 115
Erhaltene Danke: 22

WIN2000, XP, WIN 7 , UNIX, LINUX
Assembler für (Z8x, 68xxx,R6000,Intel), DELPHI 6 Enterprise, MAGIC eDeveloper V9+V10, C++, C#,VB, .NET, zertifizierter iBOLT-Programmierer
BeitragVerfasst: Mi 18.08.10 18:34 
Hey Xion,

DASS IST DER TIPP

Ich probier's morgen mal..

Wenn dass klappt, GROSSES DANKE AN ALLE IM DELPHIFORUM !!!!


mit Gruss

_________________
Wo andere aufhören, fange ich erst an..
JDKDelphi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 115
Erhaltene Danke: 22

WIN2000, XP, WIN 7 , UNIX, LINUX
Assembler für (Z8x, 68xxx,R6000,Intel), DELPHI 6 Enterprise, MAGIC eDeveloper V9+V10, C++, C#,VB, .NET, zertifizierter iBOLT-Programmierer
BeitragVerfasst: Do 19.08.10 08:51 
Hallo Delphifreunde,

das Problem mit dem Flimmern ist gelöst!!

Kleine Anweisung, große Wirkung....


Vielen Dank

_________________
Wo andere aufhören, fange ich erst an..
JDKDelphi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 115
Erhaltene Danke: 22

WIN2000, XP, WIN 7 , UNIX, LINUX
Assembler für (Z8x, 68xxx,R6000,Intel), DELPHI 6 Enterprise, MAGIC eDeveloper V9+V10, C++, C#,VB, .NET, zertifizierter iBOLT-Programmierer
BeitragVerfasst: Do 19.08.10 19:23 
@XION

Beste Grüße und ein großes Danke für Deinen Tipp.

Hat funktioniert..


Grüße

_________________
Wo andere aufhören, fange ich erst an..