title image


Smiley Lied von der Mähre, was angeblich alles nicht geht.
A little bit ooP:



Man benötigt eine Form.

Weil eine Form eine Klasse ist, die speziell auf die GUI abgestimmt wurde.

Man nennt diese Form: frmDelegate

Gegenwärtig kann Flexgrid darstellen: Eine Combobox, ein Label, eine Textbox oder ein Commandbutton statts einer Zelle!







      

Private WithEvents lbl As Label

Private WithEvents txt As TextBox

Private WithEvents cbo As ComboBox

Private WithEvents btn As CommandButton



Private Declare Function SetParent Lib "user32.dll" ( _

   ByVal hWndChild As Long, _

   ByVal hWndNewParent As Long) As Long



Private tmpCtrl As Control

Private tmpGrd As MSFlexGrid



Public Event EditorCreated(obj As Control)

Public Event EditorChanged(obj As Control)

Public Event EditorClicked(obj As Control)

Public Event EditorDistroyed()



Private Sub btn_Click()

   RaiseEvent EditorClicked(tmpCtrl)

End Sub



Private Sub cbo_Change()

   RaiseEvent EditorChanged(tmdCtrl)

   tmpGrd.TextMatrix(tmpGrd.Row, tmpGrd.Col) = cbo.Text

End Sub



Private Sub Form_Initialize()

   Set tmpCtrl = Nothing

   Visible = False

End Sub



Private Sub Form_Load()

   BorderStyle = 0

   KeyPreview = True

End Sub



Public Property Get CurrentControl() As Control

   Set CurrentControl = tmpCtrl

End Property



Public Sub DestroyEditor()

   Set tmpCtrl = Nothing

   Me.Visible = False

   RaiseEvent EditorDistroyed

   Unload Me

End Sub



Public Sub CreateEditor(grd As MSFlexGrid, ByVal nType As Integer)

   Dim c As Control

   'On Error Resume Next

   Set tmpGrd = grd

   If Not tmpCtrl Is Nothing Then

      Me.Controls.Remove (tmpCtrl.Name)

      Set tmpCtrl = Nothing

   End If

   

   Select Case nType

      Case 0

          Set lbl = Me.Controls.Add("VB.Label", "lbl")

          lbl.BorderStyle = 0

          lbl.Caption = grd.TextMatrix(grd.Row, grd.Col)

          Set tmpCtrl = lbl

      Case 1

          Set txt = Me.Controls.Add("VB.TextBox", "txt")

          txt.BorderStyle = 0

          txt.Text = grd.TextMatrix(grd.Row, grd.Col)

          Set tmpCtrl = txt

      Case 2

          Set cbo = Me.Controls.Add("VB.ComboBox", "cbo")

          cbo.Text = grd.TextMatrix(grd.Row, grd.Col)

          Set tmpCtrl = cbo

      Case 3

          Set btn = Me.Controls.Add("VB.CommandButton", "btn")

          btn.Caption = grd.TextMatrix(grd.Row, grd.Col)

          Set tmpCtrl = btn

    End Select

    

    'Form Geometries

    Height = grd.RowHeight(grd.Row) - 30

    Width = grd.ColWidth(grd.Col) - 20

    Top = (grd.Top + grd.RowPos(grd.Row))

    Left = grd.Left + grd.ColPos(grd.Col) - 10

    

    'Delegate Geometries

    With tmpCtrl

       .Left = 0

       .Top = 0

       .Width = ScaleWidth

       .Height = ScaleHeight

       .Visible = True

    End With

    

    'Fire Event

    RaiseEvent EditorCreated(tmpCtrl)

    SetParent Me.hWnd, grd.hWnd

    Visible = True

End Sub



Private Sub lbl_Click()

   RaiseEvent EditorClicked(tmpCtrl)

End Sub



Private Sub txt_Change()

   RaiseEvent EditorChanged(tmpCtrl)

   tmpGrd.TextMatrix(tmpGrd.Row, tmpGrd.Col) = cbo.Text

End Sub



Private Sub txt_Click()

   RaiseEvent EditorClicked(tmpCtrl)

End Sub

 



Code eingefügt mit Syntaxhighlighter 3.0









Anwendung:





Private WithEvents dlg As frmDelegate



Private Sub dlg_EditorCreated(obj As Control)

MsgBox "ok, createt!"

End Sub



Private Sub Flx_DblClick()

dlg.CreateEditor Flx, 3

End Sub



Private Sub Form_Load()

With Flx

.Cols = 10

.Rows = 100

End With

Set dlg = New frmDelegate

End Sub



prego :) Die Formdelegate ist natürlich beliebig erweiterbar, vielleicht: Tastaturkontrolle etc. etc.





Eine VB-Implementierung aus einem Pattern von Qt:







      

#ifndef MYITEM_H

#define MYITEM_H



#include <QItemDelegate>

#include <QList>



class QWidget;

class MyTable;



class MyItem : public QItemDelegate{

   Q_OBJECT

           

private:

   int                tmpTyp;

   MyTable            *table;

   bool               NoEdit;

   bool               HasAutoFilter;

   mutable QList<int> rowh;

   mutable int        row,column;

   

   void fillrowlist();

   

protected slots:

   void oneditchange(int);

                       

public:

   MyItem(MyTable *parent, int art);

   QWidget *createEditor (QWidget * parent, 

                            const QStyleOptionViewItem & option, 

                                   const QModelIndex & index ) const;

                                   

     void setEditorData(QWidget *editor, const QModelIndex &index) const;

     

   void setModelData(QWidget *editor, QAbstractItemModel *model,

                         const QModelIndex &index) const;

                          

   void drawDisplay(QPainter * painter, 

                      const QStyleOptionViewItem & option, 

                           const QRect & rect, 

                           const QString & text ) const ;

                    

};

#endif 



Code eingefügt mit Syntaxhighlighter 3.0









Have fun ;)




Programmierst Du noch frei oder wirst Du schon von Microsoft verwaltet ( .NET)?



geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: