KANBAN

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von menorca.

    Hallo VB 2010 Experten,
    ich arbeite mit Express und kann keine Reports erstellen
    habe mittels Code Anhang 4 Karten auf Form gezeichnet.

    nun sollen Daten aus DB in die Karten geschrieben werden
    aus Lagerplatz Schrank Fach Nr die Artikel eingetragen werden und dann gedruckt werden
    pro Artikel eine Vorderseite / Rückseite das DINA4 enthält also 2 Karten. Bei 10 Karten sind es 5 Seiten in der Vorschau die gdruckt werden müssen, oder 1 Artikel dann 1 Seite

    wie fange ich das an?

    Spoiler anzeigen

    Brainfuck-Quellcode

    1. Public Class KANBAN
    2. '--------------------------
    3. 'erstes Rechteck Zeichnen
    4. '--------------------------
    5. Private Sub RechteckeinsZeichnen(ByRef graphicsObjekt As Graphics)
    6. '//Vorderseite Karte 1
    7. Dim strMindestbestand1 As String = "Mindestbestand"
    8. Dim strMaxbestand1 As String = "Maxbestand"
    9. Dim strBestellmenge1 As String = "Bestellmenge"
    10. Dim strPreis1 As String = "Preis ca:"
    11. Dim strBezeichnung1 As String = "Bezeichnung"
    12. Dim strArtikel1 As String = "Artikelnummer"
    13. Dim strEmpaenger1 As String = "Empfänger:"
    14. Dim strLieferant1 As String = "Lieferant:"
    15. Dim strSchrank1 As String = "Schrank"
    16. Dim strFach1 As String = "Fach"
    17. 'Linie Zeichnen
    18. Dim pen As New Pen(Brushes.Black)
    19. 'Karte 1 generieren
    20. graphicsObjekt.DrawRectangle(Pens.Black, New Rectangle(75, 75, 300, 385))
    21. '//Label einbinden
    22. graphicsObjekt.DrawString(strMindestbestand1, New Font("Arial", 10), Brushes.Blue, 270, 155)
    23. graphicsObjekt.DrawString(strMaxbestand1, New Font("Arial", 10), Brushes.Blue, 270, 205)
    24. graphicsObjekt.DrawString(strBestellmenge1, New Font("Arial", 10), Brushes.Blue, 270, 255)
    25. graphicsObjekt.DrawString(strPreis1, New Font("Arial", 10), Brushes.Blue, 270, 305)
    26. 'Label Bezeichnung
    27. graphicsObjekt.DrawString(strBezeichnung1, New Font("Arial", 10), Brushes.Blue, 83, 155)
    28. 'Label Artikelnummer
    29. graphicsObjekt.DrawString(strArtikel1, New Font("Arial", 10), Brushes.Blue, 83, 255)
    30. 'Label Empfaenger
    31. graphicsObjekt.DrawString(strEmpaenger1, New Font("Arial", 10), Brushes.Blue, 83, 375)
    32. 'Label Lieferant
    33. graphicsObjekt.DrawString(strLieferant1, New Font("Arial", 10), Brushes.Blue, 83, 405)
    34. 'Label Schrank
    35. graphicsObjekt.DrawString(strSchrank1, New Font("Arial", 10), Brushes.Blue, 270, 375)
    36. 'Label Fach
    37. graphicsObjekt.DrawString(strFach1, New Font("Arial", 10), Brushes.Blue, 325, 375)
    38. 'Linie Zeichnen
    39. graphicsObjekt.DrawLine(pen, 268, 140, 268, 370)
    40. graphicsObjekt.DrawLine(pen, 75, 140, 375, 140)
    41. graphicsObjekt.DrawLine(pen, 75, 370, 375, 370)
    42. graphicsObjekt.DrawLine(pen, 75, 425, 375, 425)
    43. End Sub
    44. '--------------------------
    45. 'zweites Rechteck Zeichnen
    46. '--------------------------
    47. Private Sub RechteckzweiZeichnen(ByRef graphicsObjekt As Graphics)
    48. '//Vorderseite Karte 2
    49. Dim strMindestbestand2 As String = "Mindestbestand"
    50. Dim strMaxbestand2 As String = "Maxbestand"
    51. Dim strBestellmenge2 As String = "Bestellmenge"
    52. Dim strPreis2 As String = "Preis ca:"
    53. Dim strBezeichnung2 As String = "Bezeichnung"
    54. Dim strArtikel2 As String = "Artikelnummer"
    55. Dim strEmpaenger2 As String = "Empfänger:"
    56. Dim strLieferant2 As String = "Lieferant:"
    57. Dim strSchrank2 As String = "Schrank"
    58. Dim strFach2 As String = "Fach"
    59. 'Linie Zeichnen
    60. Dim pen As New Pen(Brushes.Black)
    61. 'Karte 2 generieren
    62. graphicsObjekt.DrawRectangle(Pens.Black, New Rectangle(406, 75, 300, 385))
    63. '//Label einbinden
    64. graphicsObjekt.DrawString(strMindestbestand2, New Font("Arial", 10), Brushes.Blue, 270, 570)
    65. graphicsObjekt.DrawString(strMaxbestand2, New Font("Arial", 10), Brushes.Blue, 270, 620)
    66. graphicsObjekt.DrawString(strBestellmenge2, New Font("Arial", 10), Brushes.Blue, 270, 675)
    67. graphicsObjekt.DrawString(strPreis2, New Font("Arial", 10), Brushes.Blue, 270, 725)
    68. 'Label Bezeichnung
    69. graphicsObjekt.DrawString(strBezeichnung2, New Font("Arial", 10), Brushes.Blue, 83, 570)
    70. 'Label Artikelnummer
    71. graphicsObjekt.DrawString(strArtikel2, New Font("Arial", 10), Brushes.Blue, 83, 675)
    72. 'Label Empfaenger
    73. graphicsObjekt.DrawString(strEmpaenger2, New Font("Arial", 10), Brushes.Blue, 83, 795)
    74. 'Label Lieferant
    75. graphicsObjekt.DrawString(strLieferant2, New Font("Arial", 10), Brushes.Blue, 83, 825)
    76. 'Label Schrank
    77. graphicsObjekt.DrawString(strSchrank2, New Font("Arial", 10), Brushes.Blue, 270, 795)
    78. 'Label Fach
    79. graphicsObjekt.DrawString(strFach2, New Font("Arial", 10), Brushes.Blue, 325, 795)
    80. 'Linie Zeichnen
    81. graphicsObjekt.DrawLine(pen, 268, 560, 268, 790) 'Senkrechte
    82. graphicsObjekt.DrawLine(pen, 75, 560, 375, 560) 'waagerechte
    83. graphicsObjekt.DrawLine(pen, 75, 790, 375, 790) 'waagerechte
    84. graphicsObjekt.DrawLine(pen, 75, 845, 375, 845) 'waagerechte
    85. End Sub
    86. Private Sub RechteckdreiZeichnen(ByRef graphicsObjekt As Graphics)
    87. 'Linie Zeichnen
    88. Dim pen As New Pen(Brushes.Black)
    89. 'Karte 3 Rückseite generieren
    90. graphicsObjekt.DrawRectangle(Pens.Black, New Rectangle(75, 493, 300, 385))
    91. End Sub
    92. Private Sub RechteckvierZeichnen(ByRef graphicsObjekt As Graphics)
    93. 'Linie Zeichnen
    94. Dim pen As New Pen(Brushes.Black)
    95. 'Karte 4 Rückseite generieren
    96. graphicsObjekt.DrawRectangle(Pens.Black, New Rectangle(406, 493, 300, 385))
    97. End Sub
    98. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    99. Dim dialogAntwort As DialogResult = PrintDialog1.ShowDialog() 'Dialog zum konfigurieren des Druckers
    100. If Not (dialogAntwort = DialogResult.OK) Then 'wenn Dialog abgebrochen wurde, Methode verlassen
    101. Return
    102. End If
    103. PrintDocument1.Print() 'drucken
    104. End Sub
    105. Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    106. RechteckeinsZeichnen(e.Graphics)
    107. RechteckzweiZeichnen(e.Graphics)
    108. RechteckdreiZeichnen(e.Graphics)
    109. RechteckvierZeichnen(e.Graphics)
    110. '//Label hinzufügen
    111. Dim strVorderseite As String = "KANBAN (Vorderseite)"
    112. Dim strRueckseite As String = "KANBAN (Rückseite)"
    113. ' Position auf der Seite bestimmen.
    114. ' In diesem Fall lesen wir dazu die Randeinstellungen
    115. ' (selbst wenn es nichts gibt, was Ihren Code davon abhalten könnte,
    116. ' die Seitengrenzen zu "übertreten".)
    117. 'Label1
    118. Dim x1 As Single = 81
    119. Dim y1 As Single = 9
    120. 'Label2
    121. Dim x2 As Single = 424
    122. Dim y2 As Single = 9
    123. 'Label3
    124. Dim x3 As Single = 293
    125. Dim y3 As Single = 199
    126. ' Label zeichnen,
    127. ' und dabei die Koordinaten verwenden, die zuvor bestimmt wurden.
    128. e.Graphics.DrawString(strVorderseite, New Font("Arial", 18), Brushes.Blue, x1, y1)
    129. e.Graphics.DrawString(strRueckseite, New Font("Arial", 18), Brushes.Blue, x2, y2)
    130. End Sub
    131. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    132. RechteckeinsZeichnen(e.Graphics)
    133. RechteckzweiZeichnen(e.Graphics)
    134. RechteckdreiZeichnen(e.Graphics)
    135. RechteckvierZeichnen(e.Graphics)
    136. '//Label hinzufügen
    137. Dim strVorderseite As String = "KANBAN (Vorderseite)"
    138. Dim strRueckseite As String = "KANBAN (Rückseite)"
    139. ' Position auf der Seite bestimmen.
    140. ' In diesem Fall lesen wir dazu die Randeinstellungen
    141. ' (selbst wenn es nichts gibt, was Ihren Code davon abhalten könnte,
    142. ' die Seitengrenzen zu "übertreten".)
    143. 'Label1
    144. Dim x1 As Single = 81
    145. Dim y1 As Single = 9
    146. 'Label2
    147. Dim x2 As Single = 424
    148. Dim y2 As Single = 9
    149. 'Label3
    150. Dim x3 As Single = 293
    151. Dim y3 As Single = 199
    152. ' Label zeichnen,
    153. ' und dabei die Koordinaten verwenden, die zuvor bestimmt wurden.
    154. e.Graphics.DrawString(strVorderseite, New Font("Arial", 18), Brushes.Blue, x1, y1)
    155. e.Graphics.DrawString(strRueckseite, New Font("Arial", 18), Brushes.Blue, x2, y2)
    156. 'e.Graphics.DrawImage(Image.FromFile(Application.StartupPath & "\test.gif"), 81, 81)
    157. End Sub
    158. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDruckVorschau.Click, Button2.Click
    159. PrintPreviewDialog1.ShowDialog()
    160. End Sub
    161. Private Sub PrintPreviewDialog1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PrintPreviewDialog1.Load
    162. PrintPreviewDialog1.Document = PrintDocument1
    163. End Sub
    164. Private Sub KANBAN_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    165. With Me
    166. .CenterToScreen()
    167. .Text = "KANBAN Ersatzteillager"
    168. End With
    169. End Sub
    170. End Class
    Bilder
    • Rechtecke.GIF

      287,12 kB, 1.136×930, 454 mal angesehen
    wenn du mit typisiertem Dataset arbeitest, kannst du die Datensätze selbst erweitern und mit Zeichen-Funktionalität ausstatten.

    gugge vlt Outlined und ziehbare Schrift

    Dabei ists egal, ob sich der Datensatz auf ein Control zeichnet, oder auf die Druck-Vorschau (was ja auch ein Control ist): Du rufst KanbanDatensatz.Paint(gr as Graphics) auf, udn das Teil malt sich.
    Sorry,

    kann dir nicht ganz folgen, das Beispiel (Oliver Kan) ist mit meinem nicht vergleichbar

    Du rufst KanbanDatensatz.Paint(gr as Graphics) auf

    ich werde da noch nicht schlau raus, ein Beispiel wie es für meinen Fall aussieht ist dir nicht möglich?

    2-3 beispielfelder
    dassis total gut vergleichbar: Es sind Datensätze, die sich selbst zeichnen können. Wie sie sich zeichnen ist völlig schnurz, und der Oliver ist nur ein Hintergrundbild, um die bessere Lesbarkeit outlineter Schrift vor unruhigem Hintergrund zu veranschaulichen.

    Du brauchst in deim typ Dataset genau dieselbe Struktur an Methoden, und nur in der Paint-Methode musstehalt was anneres reinschreiben.

    Für deinen Fall kannichdir kein Beispiel geben, denn ich habe deine Datenbank nicht.
    Hallo ErfinderdesRads,

    Für deinen Fall kannichdir kein Beispiel geben, denn ich habe deine Datenbank nicht.
    ich habe einige Tesdaten mit in der Anwendung angehängt, damit wir ein Beispiel generieren können
    LagerPlaID hat 3 Artikel = 3 Karten (oder Artikel110 = 1 Karte), auf der Rückseite ein Barcode wie bekomme ich es hin dort den Artikel als Barcode darzustellen, und wenn ein Bild vorhanden das Bild aus der DB auf die Rückseite zum Artikel. Wäre Super wenn du mir da hilfst

    In Access VBA habe ich die KANBAN immer so aktualisiert:
    Spoiler anzeigen

    Quellcode

    1. Private Sub btnKANBAN_Aktualisiert_Click()
    2. On Error GoTo Err_btnKANBAN_Aktualisiert_Click
    3. Dim stDocName As String
    4. DoCmd.SetWarnings False
    5. stDocName = "qry_ADaten"
    6. DoCmd.OpenQuery stDocName, acNormal, acEdit
    7. rec_Update
    8. DoCmd.SetWarnings True
    9. Exit_btnKANBAN_Aktualisiert_Click:
    10. Exit Sub
    11. Err_btnKANBAN_Aktualisiert_Click:
    12. MsgBox Err.Description
    13. Resume Exit_btnKANBAN_Aktualisiert_Click
    14. End Sub
    15. Private Sub rec_Update()
    16. Dim db As Database, rs As Recordset, X As Long
    17. Set db = CurrentDb
    18. Set rs = db.OpenRecordset("Select * From tmp_kanban WHERE LaBesID mod 2 = 0 ORDER BY SORT", dbOpenDynaset) 'gerade Zahlen
    19. X = 0
    20. Do Until rs.EOF
    21. rs.Edit
    22. rs!SORT = X
    23. rs.Update
    24. rs.MoveNext
    25. X = X + 2
    26. Loop
    27. Set rs = db.OpenRecordset("Select * From tmp_kanban WHERE LaBesID mod 2 = 1 ORDER BY SORT", dbOpenDynaset) 'ungerade Zahlen
    28. X = 1
    29. Do Until rs.EOF
    30. rs.Edit
    31. rs!SORT = X
    32. rs.Update
    33. rs.MoveNext
    34. X = X + 2
    35. Loop
    36. MsgBox "Daten aktualisiert!", vbInformation, "KANBAN"
    37. rs.Close
    38. Set rs = Nothing
    39. Set db = Nothing
    40. End Sub


    ComboBox hinzugefügt:
    Spoiler anzeigen

    Quellcode

    1. #Region "Lagerplatz Auswählen"
    2. Public Sub md_Filllagerplatz()
    3. Dim DBPFpad As String = Application.StartupPath
    4. Try
    5. Dim ConnectionString As String = ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
    6. "Data Source=" & DBPFpad & "\TestDaten.mdb")
    7. Dim SelectString As String = "SELECT LaPlaID AS ID, LO AS Lager, LP AS Ort " & _
    8. "FROM KANBANDATEN " & _
    9. "UNION Select 0,0,'<< Bitte Auswaehlen >>'" & _
    10. "FROM KANBANDATEN"
    11. Dim da As New OleDb.OleDbDataAdapter(SelectString, ConnectionString)
    12. da.SelectCommand.Parameters.AddWithValue("ID,Ort", Me.CBLagerplatz.Text)
    13. Dim Data As New DataSet
    14. da.Fill(Data, "tmpLagerplatz")
    15. CBLagerplatz.DataSource = Data.Tables.Item("tmpLagerplatz")
    16. CBLagerplatz.ValueMember = "ID"
    17. CBLagerplatz.DisplayMember = "Ort"
    18. Catch ex As Exception
    19. MessageBox.Show(ex.Message, "Beim Öffnen der Datenbank ist ein Fehler" & _
    20. "aufgetreten.")
    21. End Try
    22. End Sub
    23. #End Region
    Dateien
    • KAN_BAN.zip

      (238,95 kB, 192 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „menorca“ () aus folgendem Grund: ComboBox 'CBLagerplatz' hinzugefügt (Auswahl Lagerplatz)

    mir scheint, du solltest erstmal Datenmodellierung erlernen, dann ein Datenmodell erstellen, und dann erst Überlegungen anstellen, wie die Geschichte zeichnen.

    Deine TestDaten enthalten nur eine Tabelle, aber mehrere ID-Spalten (die auf nichts verweisen), und v.a. keinen Primärschlüssel.

    bei Gelegenheit bastel ich mal einen Ansatz nach dem Strickmuster von Outlined und ziehbare Schrift - aber jetzt nicht soo viel Zeit.


    Aber nochmal zur Datenbänkerei: Guck dir mal an, wie man mit Ado.Net Datenbank-Anwendungen aufzieht: "Datenbank in 10 Minuten" auf Movie-Tuts

    Und dann lass am besten die Finger davon, sondern entwickel erstmal DatasetOnly - gugge DB-Programmierung ohne Datenbank, "DatasetOnly" auf Movie-Tuts
    neuer Vorschlag: Du entwickelst dein Projekt so weit, dass du eine typisierte DataTable im DatagridView anzeigen kannst. Das Projekt hängste an, und ich bau dann den Button dran, um einen Datensatz davon auf ein Preview-Control zu zeichnen.

    Ich werd die Zeichnerei aber nur schlampig ausführen, Feinarbeiten kannste dann wieder selber machen.


    NOchmal empfehlung: machs DatasetOnly, damit kommste schneller voran.
    Hallo
    neuer Vorschlag: Du entwickelst dein Projekt so weit, dass du eine typisierte DataTable im DatagridView anzeigen kannst

    werde deinen Vorschlag annehmen. Doch habe ich eine Struktur wollte nicht alles hier hochladen
    Bilder
    • Erstellungsabfrage.GIF

      158,07 kB, 1.072×546, 291 mal angesehen

    ErfinderDesRades schrieb:

    äh - wo ist das typisierte Dataset?

    wo ist die DB??

    Quellcode

    1. Dim DBPFpad As String = Application.StartupPath


    Spoiler anzeigen

    Brainfuck-Quellcode

    1. Imports System
    2. Imports System.Data
    3. Imports System.Data.OleDb
    4. Public Class Form2
    5. Dim constr As New OleDbConnection
    6. Dim da As OleDbDataAdapter
    7. Dim dS As New DataSet
    8. Dim dBind As New BindingSource
    9. '-----
    10. Dim DBPFpad As String = Application.StartupPath
    11. Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    12. Call fill_DGV()
    13. End Sub
    14. Public Sub fill_DGV()
    15. Try
    16. Dim ConnString As String = ("Provider=Microsoft.Jet.OLEDB.4.0;" & _
    17. "Data Source=" & DBPFpad & "\TestDaten.mdb")
    18. Dim myConnection As OleDbConnection = New OleDbConnection
    19. myConnection.ConnectionString = ConnString
    20. myConnection.Open()
    21. '---------------------------------
    22. '//Tab Lagerbestand
    23. '---------------------------------
    24. Dim da As OleDbDataAdapter = New OleDbDataAdapter("SELECT tmp_kanban.* FROM tmp_kanban", _
    25. ConnString)
    26. dS = New DataSet
    27. da.Fill(dS, "tempKanban")
    28. dBind.DataSource = dS
    29. DataGridView1.DataSource = dS
    30. dBind.DataMember = dS.Tables(0).ToString()
    31. DataGridView1.DataSource = dBind
    32. Catch ex As Exception
    33. MsgBox("Es ist ein Fehler aufgetreten: " & ex.Message)
    34. End Try
    35. End Sub
    36. End Class


    also falsch?
    ich kann nix von dem in post 6 empfohlenen Lerninhalten wiederfinden (die letzten 3 Links im Post).
    Nicht der kleinste Hinweis, dass du die Links auch nur angeguckt hättest, geschweige denn die Tuts durchgearbeitet.
    Du wiederholst nur deine Vorgehensweise aus post#5

    Also ohne typisiertes Dataset kannichnix machen.
    sorry, jetzt versteh ich garnichs mehr, was ist denn so falsch dran
    (ungefähr alles)

    du wolltest ein Projekt und ein DatagridView ich lade die Daten doch über ein Dataset
    da hast du post#8 ungenau gelesen
    neuer Vorschlag: Du entwickelst dein Projekt so weit, dass du eine typisierte DataTable im DatagridView anzeigen kannst.



    menorca schrieb:

    das typisierte Dataset ist doch nur die Schritt für Schritt Anleitung MS :(
    Wat?

    ein typisiertes Dataset ist eine Klasse, die der Dataset-Designer für dich gecodet hat.

    hast du mal eines der Tuts aus post#6 durchgearbeitet, oder auch nur die Sample-Solutions mal angeguckt?
    Insbesondere dir mal einen Doppelklick aufs darin enthaltene DingsbumsDataset.Xsd erlaubt?

    Wenn ja, welches?
    jo - damit kannman nu was treiben :thumbsup:

    Und gleich mal ein Tipp:
    In der DB brauchst du sone temporäre Tabelle garnet - die kannstedir im typDataset anlegen und befüllen, und wenns prog geschlossen wird, isses weg - temporär eben.

    Oh - grad sehe ich deinen Eingangspost:
    ich arbeite mit Express und kann keine Reports erstellen
    Bist du dir sicher, dass du wg Express keine Reports erstellen kannst, oder liegt es einfach daran, dass du kein typDataset hattest?

    (ich weisses nicht - ich hab kein Express)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    uff - da war doch bisserl tiefer in die Trickkiste zu greifeln

    Er zeichnet bislang auch nur eine Karte, und die Positionierung läßt noch zu wünschen übrig, weil die Texte alle nach oben links ausgerichtet sind.
    Und Word-Wrap ist auch noch nicht drinne, aber du kannst dich ja mal mit der verqueren Positionierungs-Logik vertraut machen.

    Ich habe nämlich ein HTabs / VTabs - Konzept erfunden:

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports System.Drawing.Drawing2D
    3. Partial Class TestDatenDataSet
    4. Partial Class tmp_kanbanRow
    5. Private Shared _Mtr As New Matrix, _Gp As New GraphicsPath, _NormSize As New SizeF(1000, 1400)
    6. Private Shared _Htabs0 As Single() = New Single() {1.5, 1.5, 1.1, 0.9}, _HSum As Single = _Htabs0.Sum
    7. Private Shared _Vtabs0 As Single() = New Single() {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.5}, _VSum As Single = _Vtabs0.Sum
    8. Private Shared _Htabs As Single() = ConvertTabs(_Htabs0, _NormSize.Width / _Htabs0.Sum)
    9. Private Shared _Vtabs As Single() = ConvertTabs(_Vtabs0, _NormSize.Height / _Vtabs0.Sum)
    10. Private Shared _TextSizes As Integer() = (New Integer() {50, 40}).Cyclic(True)
    11. Private Shared Function GetPoint(ByVal htab As Integer, ByVal vtab As Integer) As PointF
    12. If htab < 0 Then htab += _Htabs.Length
    13. If vtab < 0 Then vtab += _Vtabs.Length
    14. Return New PointF(_Htabs(htab), _Vtabs(vtab))
    15. End Function
    16. Private Shared Function ConvertTabs(ByVal tabs As Single(), ByVal scale As Single) As Single()
    17. Dim retVal(tabs.Length) As Single
    18. Dim pos = 0.0F
    19. For i = 0 To tabs.Length - 1
    20. pos += tabs(i) * scale
    21. retVal(i + 1) = pos
    22. Next
    23. Return retVal
    24. End Function
    25. Private Sub line(ByVal x0 As Integer, ByVal y0 As Integer, ByVal x1 As Integer, ByVal y1 As Integer)
    26. With _Gp
    27. .StartFigure()
    28. .AddLine(GetPoint(x0, y0), GetPoint(x1, y1))
    29. End With
    30. End Sub
    31. Private Sub Text(ByVal txt As Object, ByVal htab As Integer, ByVal vtab As Integer)
    32. _Gp.AddString(txt.ToString, FontFamily.GenericSansSerif, 0, _TextSizes.Current, GetPoint(htab, vtab), StringFormat.GenericDefault)
    33. End Sub
    34. Public Sub Draw(ByVal g As Graphics, ByVal rct As RectangleF)
    35. g.SmoothingMode = SmoothingMode.HighQuality
    36. _Mtr.Scale((rct.Width - 1) / _NormSize.Width, (rct.Height - 1) / _NormSize.Height, MatrixOrder.Append)
    37. With _Gp
    38. 'horizontale linien
    39. line(0, 0, -1, 0)
    40. line(0, 1, -1, 1)
    41. line(0, -1, -1, -1)
    42. line(0, -2, -1, -2)
    43. line(0, -4, -1, -4)
    44. 'vertikale linien
    45. line(0, 0, 0, -1)
    46. line(2, 1, 2, -4)
    47. line(-1, 0, -1, -1)
    48. .Transform(_Mtr)
    49. g.DrawPath(Pens.Red, .Self)
    50. .Reset()
    51. 'Beschriftungen
    52. Text("Bezeichnung", 0, 1)
    53. Text("Mindestbestand", 2, 1)
    54. Text("Maxbestand", 2, 3)
    55. Text("Artikelnummer", 0, 5)
    56. Text("Bestellmenge", 2, 5)
    57. Text("Preis ca:", 2, 7)
    58. Text("Empfänger:", 0, -4)
    59. Text("Schrank", 2, -4)
    60. Text("Fach", 3, -4)
    61. Text("Lieferant", 0, -3)
    62. _TextSizes.Yield()
    63. .Transform(_Mtr)
    64. g.FillPath(Brushes.Blue, .Self)
    65. .Reset()
    66. 'Daten
    67. Text(ArtBezeichnung, 0, 2)
    68. Text(Me.MIN, 2, 2)
    69. Text(MAX, 2, 4)
    70. Text(ArtNummer, 0, 6)
    71. Text(Menge, 2, 6)
    72. Text("Woher nehmen?", 2, 8)
    73. Text("Woher nehmen?", 1, -4)
    74. Text(S, 2, -3)
    75. Text(F, 3, -3)
    76. Text("Woher nehmen?", 1, -3)
    77. _TextSizes.Yield()
    78. .Transform(_Mtr)
    79. g.FillPath(Brushes.Black, .Self)
    80. .Reset()
    81. End With
    82. _Mtr.Reset()
    83. End Sub
    84. End Class
    85. End Class
    in den Zeilen #10 und #11 legst du die relativen Spaltenbreiten/zeilenhöhen fest. Das wird nicht in fixen Werten festgelegt, sondern die Zahlen sind Verhältnis-Werte: vergrößerst du eine Spalte, so verkleinern sich alle anderen im Verhältnis dazu. Damit kannst du die Positionierung eiglich recht komfortabel konfigurieren - die Zahlen akzeptieren auch Komma-Werte.
    Du kannst auch V/H-Tabs zufügen - nur dann musst du auch die Ausgabe anpassen.
    Jedenfalls erhält man durch die V/H-Tabs eine Art Gitter, kann man sich vorstellen, und die obenLinks - Ecke jeder Zelle ist über einen htab/vtab indizierbar. Also codezeile#67 schreibt zB "BestellMenge" in die Zelle {2/5}

    Mit den Daten blicke ich nicht ganz durch, bei "Preis ca.", "Empfänger" und "Lieferant" habich kein Plan, welchen Wert aus der tmp_kanbanRow da einzutragen sein soll.
    Dateien
    • KanBan02.zip

      (192,9 kB, 160 mal heruntergeladen, zuletzt: )

    Fragen beantworten

    Guten Morgen,

    na Hut ab, das hätte ich soweit nie hinbekommen, bist halt der Profi
    die verqueren Positionierungs-Logik verstehen tu ich mich auch noch sehr schwer
    da haste wirklich in die Trickkiste gegriffen, SUPER

    Beispweise: die Auswahl im Datagrid kann ich im Einzelschritt nicht nachvollziehen
    und sicher werde ich die Vorschau und alle Karten von Lagerplatz x drucken nicht hinbekommen
    und ob ich das in mein Projekt mit einbinden kann ?? da die Original DB auf einem LW:\ X liegt

    daher meine Frage wie bringen wir es nun ins gewünschte Ergebnis, ich werde natürlich versuchen
    verqueren Positionierungs-Logik irgendwie zu verstehen, aber wie man an alle Karten kommt also Vorderseite Rückseite wie Anfangs beschrieben :huh:

    Mit den Daten blicke ich nicht ganz durch, bei "Preis ca.", "Empfänger" und "Lieferant" habich kein Plan, welchen Wert
    den Preis setze ich auf k.a. (Keine Angabe), Lieferant bekommt auch den Eintrag n.B. (nicht benannt) da er sonst immer nachgepflegt werden muss wenn Artikel A von Lieferant X oder Y kommt müssen die Karten auch jedesmal Neu gedruckt werden, Empfänger: ist immer IH = Instandhaltung (Standardtext) die Lagerverwaltung ist im diesem Projekt die Instandhaltung

    Code geändert:

    Spoiler anzeigen

    Quellcode

    1. Imports System.Drawing
    2. Imports System.Drawing.Drawing2D
    3. Partial Class TestDatenDataSet
    4. Partial Class tmp_kanbanRow
    5. Private Shared _Mtr As New Matrix, _Gp As New GraphicsPath, _NormSize As New SizeF(1000, 1400)
    6. Private Shared _Htabs0 As Single() = New Single() {1.5, 1.5, 1.1, 0.9}, _HSum As Single = _Htabs0.Sum
    7. Private Shared _Vtabs0 As Single() = New Single() {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.5}, _VSum As Single = _Vtabs0.Sum
    8. Private Shared _Htabs As Single() = ConvertTabs(_Htabs0, _NormSize.Width / _Htabs0.Sum)
    9. Private Shared _Vtabs As Single() = ConvertTabs(_Vtabs0, _NormSize.Height / _Vtabs0.Sum)
    10. Private Shared _TextSizes As Integer() = (New Integer() {50, 40}).Cyclic(True)
    11. Private Shared Function GetPoint(ByVal htab As Integer, ByVal vtab As Integer) As PointF
    12. If htab < 0 Then htab += _Htabs.Length
    13. If vtab < 0 Then vtab += _Vtabs.Length
    14. Return New PointF(_Htabs(htab), _Vtabs(vtab))
    15. End Function
    16. Private Shared Function ConvertTabs(ByVal tabs As Single(), ByVal scale As Single) As Single()
    17. Dim retVal(tabs.Length) As Single
    18. Dim pos = 0.0F
    19. For i = 0 To tabs.Length - 1
    20. pos += tabs(i) * scale
    21. retVal(i + 1) = pos
    22. Next
    23. Return retVal
    24. End Function
    25. Private Sub line(ByVal x0 As Integer, ByVal y0 As Integer, ByVal x1 As Integer, ByVal y1 As Integer)
    26. With _Gp
    27. .StartFigure()
    28. .AddLine(GetPoint(x0, y0), GetPoint(x1, y1))
    29. End With
    30. End Sub
    31. Private Sub Text(ByVal txt As Object, ByVal htab As Integer, ByVal vtab As Integer)
    32. _Gp.AddString(txt.ToString, FontFamily.GenericSansSerif, 0, _TextSizes.Current, GetPoint(htab, vtab), StringFormat.GenericDefault)
    33. End Sub
    34. Public Sub Draw(ByVal g As Graphics, ByVal rct As RectangleF)
    35. g.SmoothingMode = SmoothingMode.HighQuality
    36. _Mtr.Scale((rct.Width - 1) / _NormSize.Width, (rct.Height - 1) / _NormSize.Height, MatrixOrder.Append)
    37. With _Gp
    38. 'horizontale linien
    39. line(0, 0, -1, 0)
    40. line(0, 1, -1, 1)
    41. line(0, -1, -1, -1)
    42. line(0, -2, -1, -2)
    43. line(0, -4, -1, -4)
    44. 'vertikale linien
    45. line(0, 0, 0, -1)
    46. line(2, 1, 2, -4)
    47. line(-1, 0, -1, -1)
    48. .Transform(_Mtr)
    49. g.DrawPath(Pens.Red, .Self)
    50. .Reset()
    51. 'Beschriftungen
    52. Text("LOGO", 0, -13)
    53. Text("Bezeichnung", 0, 1)
    54. Text("Mindestbestand", 2, 1)
    55. Text("Maxbestand", 2, 3)
    56. Text("Artikelnummer", 0, 5)
    57. Text("Bestellmenge", 2, 5)
    58. Text("Preis ca:", 2, 7)
    59. Text("Empfänger:", 0, -4)
    60. Text("Schrank", 2, -4)
    61. Text("Fach", 3, -4)
    62. Text("Lieferant", 0, -3)
    63. Text("Lagerort:", 0, -2)
    64. _TextSizes.Yield()
    65. .Transform(_Mtr)
    66. g.FillPath(Brushes.Blue, .Self)
    67. .Reset()
    68. 'Daten
    69. Text(ArtBezeichnung, 0, 2)
    70. Text(Me.MIN, 3, 2)
    71. Text(MAX, 3, 4)
    72. Text(ArtNummer, 0, 6)
    73. Text("k.a.", 3, 6)
    74. Text("k.a.", 3, 8)
    75. Text("IH", 1, -4)
    76. Text(S, 2, -3)
    77. Text(F, 3, -3)
    78. Text("N.B.", 1, -3)
    79. Text(LO, 2, -2)
    80. _TextSizes.Yield()
    81. .Transform(_Mtr)
    82. g.FillPath(Brushes.Black, .Self)
    83. .Reset()
    84. End With
    85. _Mtr.Reset()
    86. End Sub
    87. End Class
    Bilder
    • KANBAN.GIF

      209,33 kB, 933×763, 212 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „menorca“ () aus folgendem Grund: Antworten


    hier ist das HTabs/VTabs - Konzept weiterentwickelt und in eine "TableLayout"-Klasse gekapselt.

    Die Anwendung verwendet 2 TableLayout-Instanzen, an ganz verschiedenen sTellen:

    Das Form macht auf dem Canvas-Control ein TableLayout mit 3*3 Zellen, in dieser Form:

    Also 4 große Felder, durch schmale Spalten voneinander abgesetzt.

    die typisierte DataRow nutzt ein anneres TableLayout, mit folgender Unterteilung:

    Also viele Zellen, wo jeweils was reingeschrieben werden kann.
    Bzw. von den Zellen können auch Linien gezeichnet werden.

    Jo, und zum malen zweier Datensätze nimmt er je einen Datensatz, und läßt links die (komplizierte) Vorderseite malen, und rechts die Rückseite, und desgleichen mit dem darauf folgenden Datensatz, und fertich.
    Dateien
    • KanBan04.zip

      (198,53 kB, 145 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()