Autor |
Beitrag |
JDKDelphi
      
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
|
Verfasst: 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
      
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: 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 
      
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
|
Verfasst: 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 
      
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
|
Verfasst: 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
      
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Mi 18.08.10 15:34
paint message von abfangen und nur zeichnen wenn erwünscht?
|
|
JDKDelphi 
      
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
|
Verfasst: 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:
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
      
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Mi 18.08.10 15:45
dann wirst du wohl um eine graphik im speicher nicht drumm herum kommen
|
|
JDKDelphi 
      
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
|
Verfasst: 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
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: 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
      

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)
|
Verfasst: Mi 18.08.10 16:51
_________________ 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 
      
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
|
Verfasst: 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 
      
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
|
Verfasst: 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 
      
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
|
Verfasst: 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..
|
|
|