| |
Visual-Basic EinsteigerDarstellung einer Abholstellenlinie | | | Autor: crosstravel | Datum: 02.12.19 18:22 |
| Hallo,
einer unserer Kunden ist ein Busreiseunternehmer, welcher die Teilnehmer der verschiedenen Reisen an bestimmten Zusteigestellen bei Reisebeginn abholt. Die vielleicht 120 Abstellen sind je nach Fahrtrichtung in z.B 5 sogenannte Abhollinien gruppiert. Die Anzahl Abholstellen je Abhollinie ist variabel. Sö.. auf der Linie 1 z.B. 18 Abholstellen liegen, auf der Linie 3 aber z.B. 40.
Der Kunde möchte, dass die einzelnen Abhollinien auf jeweils einer horizontalen Linie dargestellt werden. Jede daraufliegende Abholstelle soll durch ein kleines Quadrat dargestellt werden. Wenn man auf das Quardrat klickt, soll man die Uhrzeit (wann steigen die Personen zu) erfassen/ändern können. In dem Vorgang sollen evtl. noch weitere Eingaben zur Abholstelle gemacht werden könn (zB. Hintergrundfarbe ändern).
Ist für mich sehr komplex. Hat jemand eine Idee, wie ich die Sache hinbiegen kann? Evtl. über ein Grid ....
Danke
Rainer | |
Re: Darstellung einer Abholstellenlinie | | | Autor: Zardoz | Datum: 02.12.19 21:56 |
| Hallo Rainer,
wenn nichts wesentliches mehr dazu kommt, kann man das
mit Line-Controls und Labels realisieren. Flexgrid ginge
auch, ist aber schwieriger. Über das Click-Event kannst
du eine Textbox mit Infos anzeigen oder ein Popup-Menü
aufrufen. Hier mal ein Ansatz:
Controls:
1 * Label (Label1) mit Index = 0
1 * Line-Control (Line1) mit Index = 0
Private Sub Form_Load()
Dim i&, j&, n&, xp&, yp&
Me.ScaleMode = vbPixels
Randomize
n = 0
For i = 0 To 14
If i > 0 Then Load Line1(i)
yp = 30 + 40 * i
With Line1(i)
.X1 = 10
.Y1 = yp
.X2 = 800
.Y2 = .Y1
.Visible = True
End With
xp = 10 + Int(50 * Rnd)
For j = 1 To Int(Rnd * 8 + 2)
If n > 0 Then Load Label1(n)
With Label1(n)
.Caption = ""
.Move xp, yp - 15, 30, 30
.BorderStyle = vbBSNone
.BackColor = QBColor(Rnd * 15)
.ToolTipText = "Uhrzeit: ..."
.ZOrder vbBringToFront
.Visible = True
End With
xp = xp + Int(Rnd * 60 + 40)
n = n + 1
Next j
Next i
End Sub
Private Sub Label1_Click(Index As Integer)
MsgBox "Pos:" & Str$(Index) & vbCr & "Uhrzeit: ..." & vbCr _
& "Personen: ...", vbInformation + vbOKOnly
End Sub Gruss,
Zardoz | |
Re: Darstellung einer Abholstellenlinie | | | Autor: crosstravel | Datum: 02.12.19 22:54 |
| Hallo Zardoz,
Danke für dein schnelles Feedback. Ich werde es morgen mal testen. Sieht für mich relativ komplex aus 😓 die verschiedenen Indexe und Koordinaten verwirren (habe so etwas noch nie gemacht) ... bin deshalb auf das Resultat gespannt .... Danke | |
Re: Darstellung einer Abholstellenlinie | | | Autor: crosstravel | Datum: 03.12.19 06:27 |
| Hallo Zardoz,
ich habe jetzt Deinen Vorschlag getestet. Es sieht schon ziemlich gut aus. Die Labels auf jeder der 14 Linien sind random verteilt und von unterschiedlicher Farbe. Zu Beginn des Programmes ist es bekannt,
wieviele Abholstellen pro Linie vorhanden sind (Input von DB). So kann ich wohl auf das Random verzichten. Auch ist bekannt, wieviele Personen jeweils pro Abholstelle zusteigen.
Ist es möglich, die Anzahl der Personen über Caption bei der jeweiligen Abholstelle anzuzeigen? Ich denke, gemäss Deinem Beispiel geht es über .Caption = aRs!AnzahlPersonen.
Ist es möglich, die Linie zwischen den einzeln Abholstellen immer gleich lang zu machen? In deinem
Beispiel ist diese immer unterschiedlich lang.
Herzlichen Gruss und guten Start in den Tag
Rainer | |
Re: Darstellung einer Abholstellenlinie | | | Autor: Zardoz | Datum: 03.12.19 07:27 |
| Hallo Rainer,
auf das Rnd kannst du verzichten, das war nur zur Demonstration.
Ändere den Code mal so:
Private Sub Form_Load()
Dim i%, j%, n%, xp&, yp&, Per%
Me.ScaleMode = vbPixels
n = 0
For i = 0 To 14 - 1 ' Anzahl Linien
If i > 0 Then Load Line1(i)
yp = 30 + 40 * i ' Abstand von oben und Abstand zwischen den Linien
With Line1(i)
.X1 = 10
.Y1 = yp
.X2 = 800
.Y2 = yp
.Visible = True
End With
For j = 1 To 12 ' Anzahl Abholstellen
If n > 0 Then Load Label1(n)
Per = aRs!AnzahlPersonen ' Anzahl Personen. Datenbank geöffnet?
xp = 30 + 60 * (j - 1) ' Abstand von links und Abstand zwischen den
' Abholstellen
With Label1(n)
.Alignment = 2
.Caption = CStr(Per)
.Move xp, yp - 15, 30, 30
.BorderStyle = vbBSNone
.ForeColor = vbWhite
.BackColor = QBColor(Rnd * 14)
.ToolTipText = "Uhrzeit: ..."
.ZOrder vbBringToFront
.Visible = True
End With
n = n + 1
Next j
Next i
End Sub Gruss,
Zardoz | |
Re: Darstellung einer Abholstellenlinie | | | Autor: crosstravel | Datum: 03.12.19 07:35 |
| Hallo Zardoz,
vielen Dank, werde den Code gleich mal anpassen und testen. Ich habe aber noch eine andere Frage hinsichtlich des Index. In dem Beispiel wird der Indix für alle Zustiege hochgezählt. Ich sollte
eine Möglichkeit haben gestzstellen, auf welcher Abhollinie (z.B. 1-14) ein Index liegt. So kann
ich bein Click auf ein Label, die Informationen genau dieser Linie abrufen und auch anzeigen.
Siehst Du dazu eine Möglichkeit?
Private Sub Label1_Click(Index As Integer)
MsgBox "Pos:" & Str$(Index) & vbCr & "Uhrzeit: ..." & vbCr _
& "Personen: ..." & Linieninfo, vbInformation + vbOKOnly
End Sub | |
Re: Darstellung einer Abholstellenlinie | | | Autor: crosstravel | Datum: 03.12.19 07:44 |
| Hi Zardoz,
habe eben dein angepasstes Beispiel getestet. Passt perfekt - super. Eine weitere Frage habe ich noch. Im Beispiel wird immer die gleiche Anzahl Zustiegsstellen pro Linie ausgegeben. Jetzt ist es aber so,
dass jede Linie eine unterschiedliche Anzahl von Zusteigestellen aufweist.
Diese Information kann ich auch vor der Anzeige über die Datenbank (Stammdaten) abrufen. Wie wird in dem Beispiel die Anzahl der Abholstellen, welche auf einer Linie liegen, gesteuert und wie kann ich das variabel gestalten?
Ich denke, dass ich nach den Antworten ein ganzes Stück weiter bin.
Danke
Rainer | |
Re: Darstellung einer Abholstellenlinie | | | Autor: crosstravel | Datum: 03.12.19 10:57 |
| Hi Zardoz,
die Frage mit der Anzahl Abholstellen konnte ich beantworten. Danke. | |
Re: Darstellung einer Abholstellenlinie | | | Autor: crosstravel | Datum: 03.12.19 11:02 |
| Hallo Zardoz,
ich möchte auf jeder Abholzeile vor der 1. Abholstelle die Bezeichnung der Abhollinie (z.B. Linie Rathaus) ausgeben. Besteht dazu die Möglichkeit?
Beüglich der Indexfrage denke ich, dass ich die jeweilige Abhollinie anhand der bekannten Anzahl der Abholstellen auf der ermitteln kann. Hat zB. die 1. Abhollinie 25 Abholstellen, und ist der Index der angeklickten Abholstelle = 26, dann muss diese auf der Linie 2 liegen.
Kannst Du mir bitte noch mitteilen, wie (über welche Einstellungen) ich die Grösse der angezeigten Boxen verändern Kann?
Gruss
Rainer
Beitrag wurde zuletzt am 03.12.19 um 11:33:49 editiert. | |
Re: Darstellung einer Abholstellenlinie | | | Autor: crosstravel | Datum: 03.12.19 14:25 |
| Hallo,
ich versuche, die angezeigten Abholstellen-Quadrate in der Grösse zu verändern. Leider funktioniert das so nicht. Height und Width werden nicht erkannt. Was ist denn hier nicht korrekt?
With Label1(N)
.Alignment = 2
.Height = 400
.Width = 100
.Caption = CStr(Per)
.Move xp, yp - 15, 30, 30
.BorderStyle = vbBSNone
.ForeColor = vbWhite
.BackColor = QBColor(Rnd * 14)
.ToolTipText = "Uhrzeit: ..."
.ZOrder vbBringToFront
.Visible = True
End With | |
Re: Darstellung einer Abholstellenlinie | | | Autor: Zardoz | Datum: 03.12.19 14:36 |
| Hallo Rainer,
Zitat: | |
Ich sollte
eine Möglichkeit haben gestzstellen, auf welcher Abhollinie (z.B. 1-14) ein Index liegt. So kann
ich bein Click auf ein Label, die Informationen genau dieser Linie abrufen und auch anzeigen.
Siehst Du dazu eine Möglichkeit?
| |
Beim Setzen der Labeleigenschaften das hinzufügen:
With Label1(n)
.Tag = CStr(i) & "/" & CStr(j) Das Click-Event so erweitern:
Private Sub Label1_Click(Index As Integer)
Dim T$, LineNr%, AbholSt%
T = Label1(Index).Tag
LineNr = 1 + Val(T)
AbholSt = Val(Mid$(T, 1 + InStr(1, T, "/")))
MsgBox "Linie:" & Str$(LineNr) & vbCr _
& "Abholstelle:" & Str$(AbholSt), vbInformation + vbOKOnly
End Sub Zitat: | |
ich möchte auf jeder Abholzeile vor der 1. Abholstelle die Bezeichnung der Abhollinie (z.B. Linie Rathaus) ausgeben. Besteht dazu die Möglichkeit?
| |
Ein weiteres Label-Array (z.B. Label2(..) anlegen und in der i-Schleife
positionieren und belegen.
Zitat: | |
Kannst Du mir bitte noch mitteilen, wie (über welche Einstellungen) ich die Grösse der angezeigten Boxen verändern Kann?
| |
Erweitere den Code mal so:
Dim Breite&, Hoehe&
Breite = 30 ' Pixel
Hoehe = 30 ' Pixel
With Label1(n)
' ...
.Move xp, yp - Hoehe / 2, Breite, Hoehe Gruss,
Zardoz
Beitrag wurde zuletzt am 03.12.19 um 14:38:27 editiert. | |
Re: Darstellung einer Abholstellenlinie | | | Autor: crosstravel | Datum: 03.12.19 19:30 |
| Hallo Zardoz,
darf ich noch eine Frage stellen? Ich habe deine Routine wie nachstehend angepasst. Nun wollte ich die gewünschte Bezeichnung der Abhollinie (Label2) einbauen. Das funktioniert leider nicht und ich sehe auch noch nicht, was die Ursache für das Fehlverhalten ist. Label2 soll vor jeder Linie ausgegeben werden. Deshalb habe ich es in der i-Schleife positioniert. Das label sollte viellicht 20 Pixel vom linken Rand stehen; gefolgt von der 1. Abholstelle auf der Linie. Sie sollt zusätzlich gleich hoch sein, wie die Boxen je Abholstelle. Momentan wird nur das erste Label2(0) angezeigt.
Kannst Du mir bitte nochmal Feedback geben?
Danke
Rainer
Private Sub Fahrplan()
Dim i%, j%, N%, xp&, yp&, Per%
Dim Breite&, Hoehe&
nAnzahl_Lines = 5
AnzZustiege = 20
Breite = 15 ' Pixel
Hoehe = 25 ' Pixel
Me.ScaleMode = vbPixels
N = 0
For i = 0 To (nAnzahl_Lines - 1) ' Anzahl Linien
If i > 0 Then Load Line1(i)
yp = 30 + 40 * i ' Abstand von oben und Abstand
' zwischen den Linien
With Line1(i)
.X1 = 10
.Y1 = yp
.X2 = 800
.Y2 = yp
.Visible = True
End With
If i > 0 Then
Load Label2(i)
End If
With Label2(i)
.left = 30
.Alignment = 2
.Caption = "Linienname"
.BorderStyle = vbBSNone
.ForeColor = QBColor(0)
.BackColor = QBColor(14)
.ZOrder vbBringToFront
.Visible = True
End With
X1 = i
Init_Linie
For j = 1 To AnzZustiege ' Anzahl Abholstellen
If N > 0 Then Load Label1(N)
Per = AnzPersonen ' Anzahl Personen. Datenbank
' geöffnet?
' xp = 30 + 40 * (j - 1) ' Abstand von links und Abstand _
zwischen den
xp = 120 + 40 * (j - 1) ' Abstand von links und Abstand
' zwischen den
With Label1(N)
.Alignment = 2
.Caption = CStr(Per)
.Move xp, yp - Hoehe / 2, Breite, Hoehe
.BorderStyle = vbBSNone
.ForeColor = QBColor(ForegroundColor)
.BackColor = QBColor(BackgroundColor)
.ToolTipText = "Uhrzeit: ..."
.Tag = CStr(i) & "/" & CStr(j)
.ZOrder vbBringToFront
.Visible = True
End With
N = N + 1
Next j
AnzZustiege = 5
Next i
End Sub | |
Re: Darstellung einer Abholstellenlinie | | | Autor: Zardoz | Datum: 03.12.19 21:52 |
| Hallo Rainer,
du musst bei Label2 die y-Position (also .Top) angeben.
Erweitere den Code mal so:
With Label2(i)
'.left = 30
.Left = 20 ' Abstand von links
.Top = yp - Hoehe / 2 ' Abstand von oben
.Height = Hoehe ' Labelhöhe
' ... Statt QBColor verwende besser die VB-Konstanten (vbRed usw.)
und die RGB-Funktion.
Gruss,
Zardoz | |
Re: Darstellung einer Abholstellenlinie | | | Autor: crosstravel | Datum: 04.12.19 05:48 |
| Guten Morgen Zardoz,
das war es, jetzt sieht es gut aus. Ich möchte mich nochmals für Deine Unterstützung und Geduld bedanken. Du hast mir sehr geholfen.
Herzliche Grüsse
Rainer | |
Re: Darstellung einer Abholstellenlinie | | | Autor: crosstravel | Datum: 06.12.19 08:41 |
| Hallo Zardoz,
ja, langsam kommt das Projekt zum Fliegen. Vielleicht kannst Du mir noch einen Rat zu folgender Problemstellung geben.
Ich habe das Label-Array direkt auf der Form plaziert, also nicht in einem Container. Jetzt habe ich festgestellt, dass ich horizontal in einer Abhollinie 30 Abholstellen darstellen kann. Habe ich jedoch mehr als 30 Orte, werden diese nicht mehr angezeigt und ich habe auch keine Möglichkeit, horizontal zu scrollen.
Da aber die Möglichkeit das horizontalen Scrollens erforderlich ist, muss ich wohl die Controls (Label1, Label2, Line) in einen scrollbaren Container legen. Was könntest Du da vorschlagen?
Vielen Dank und Gruss
Rainer | |
Re: Darstellung einer Abholstellenlinie | | | Autor: Zardoz | Datum: 06.12.19 15:04 |
| Hallo Rainer,
als Container kannst du eine Picturebox oder ein Frame-Control
verwenden. Das Frame kennt nur Twips als Einheit. Dann musst
du alle Pixel in Twips umrechnen. Bei der Picturebox kannst
du Pixel als Einheit einstellen. Es gibt hier auch einen
Tipp dazu. Muss man noch etwas anpassen:
https://www.vbarchiv.net/tipps/details.php?id=328
Alternative wäre ein MSFlexgrid. Probier mal dies:
Controls:
1 * MSFlexgrid (MSFlexgrid1)
1 * Picturebox (Picture1)
Private flg1 As Boolean
Private PicLst() As StdPicture
Private Sub Form_Load()
Me.MousePointer = vbHourglass
Me.ScaleMode = vbPixels
Me.KeyPreview = True
Randomize
flg1 = False
End Sub
Private Sub Form_Activate()
If flg1 = True Then Exit Sub
flg1 = True
DoEvents
Call FillGrid
Me.MousePointer = vbDefault
End Sub
Private Sub FillGrid()
Dim SW&, SH&, i&, j&, Farben&
Farben = 32
ReDim PicLst(Farben - 1)
SW = 68
SH = 40
With Picture1
.Visible = False
.BorderStyle = vbBSNone
.Move 0, 0, 68, 40
.ScaleMode = vbPixels
.BackColor = vbButtonFace
.AutoRedraw = True
.FillStyle = vbFSSolid
For i = 0 To Farben - 1
.Cls
Picture1.Line (0, SH / 2)-Step(SW, 0), vbRed
.FillColor = Rnd * &HFFFFFF
Picture1.Circle (SW / 2, SH / 2), 19, vbBlack
Set PicLst(i) = .Image
Next i
.Cls
End With
With MSFlexGrid1
.Redraw = False
.Move 0, 0, 1100, 650
.ScrollTrack = True
.WordWrap = True
'.GridLines = flexGridNone ' Gitter ja/nein
.FixedRows = 1
.FixedCols = 1
.BackColor = Picture1.BackColor
.ForeColor = vbWhite
.Cols = 35
.Rows = 20
.ScrollBars = flexScrollBarBoth
.RowHeight(-1) = 44 * Screen.TwipsPerPixelY
.ColWidth(-1) = 70 * Screen.TwipsPerPixelX
.TextArray(0) = "Plan"
For i = 1 To .Cols - 1
.TextArray(i) = "Station " & CStr(i)
Next i
For i = 1 To .Rows - 1
.TextMatrix(i, 0) = "Linie " & CStr(i) & vbCr & _
Choose(1 + (i Mod 4), "Bahnhof", "Rathaus", "Museum", "Stadion")
Next i
For i = 1 To .Rows - 1
.Row = i
For j = 1 To .Cols - 1
.Col = j
.Text = CStr(Int(Rnd * 16)) & " P."
.CellAlignment = flexAlignCenterCenter
.CellPictureAlignment = flexAlignCenterCenter
Set .CellPicture = PicLst(Int(Rnd * Farben))
Next j
Next i
.Row = .FixedRows
.Col = .FixedCols
.Redraw = True
End With
Screen.MousePointer = vbDefault
End Sub
Private Sub MSFlexGrid1_Click()
Dim r&, c&, N&
With MSFlexGrid1
r = .Row
c = .Col
N = Val(.TextMatrix(r, c))
End With
MsgBox "Linie: " & CStr(r) & vbCr & "Station: " & CStr(c) & vbCr & _
"Personen: " & CStr(N), vbInformation + vbOKOnly, App.Title
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyReturn
Call MSFlexGrid1_Click
Case vbKeyEscape
Unload Me
End Select
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSFlexGrid1.Clear
Erase PicLst
End Sub Gruss,
Zardoz | |
Re: Darstellung einer Abholstellenlinie | | | Autor: crosstravel | Datum: 06.12.19 16:04 |
| Hallo Zardoz,
ich hatte bereits den Tipp von Dieter ausprobiert; sowohl mit einer Picturebox wie auch mit einem Frame. DEie auf der Picturebox befindlichen Label (Label1, Label2 und Line1) wurden nicht richtig
dargestellt. Alles war zusammegzogen und in der oberen rechten Ecke positioniert.
Als ich die Picturebox entfernte und die Objekte wieder direkt auf der Form plazierte, war es wieder ok. Ich versuche es jetzt mal mit Deinem Beispiel.
Danke und schönen Abend
Rainer | |
Re: Darstellung einer Abholstellenlinie | | | Autor: crosstravel | Datum: 19.12.19 15:28 |
| Hallo Zardoz,
ich konnte die erste Version des Programmes, welches ich mit Deiner Hilfe erstellen konnte, dem Kunden vorlegen. Er war weitgehend zufrieden. Nur wünscht er, dass entsprechende seinen Vorgaben zwischen den einzelnen Abholstellen nicht immer der gleiche Abstand ist. Dieser Abstand soll individuell aufgrund von bestimmten Werten in der DB gesetzt werden.
Ich habe es einmal wie nachstehend versucht. Den linken Rand habe ich auf 300 gesetzt. Das funktioniert. Aber mit den variablen Abständen zwischen den einzelnen Abholstellen klappt es nicht. Ich will z.B. dass die 2. Abholstelle 200 pixel rechts von der 1. Abholstelle dargestellt wird; und z.B. die 3. Abholstelle 100 Pixel rechts von der 2. Abholstelle. Hier gibt es ein Durcheinander. Die 3. Abholstelle steht dann v o r der 2. - mache ich hier eine flasche Überlegung?
Danke für Deinen Ratschlag und Gruss
Rainer
' ---------------------------------------------------------------------
' Abholstellen: Abstand von links und Abstand zwischen den Abholstellen
' ---------------------------------------------------------------------
If i = 0 Then ' = 0 --> 1. Reihe
xp = 600 + 40 * (j - 1) ' Abstand von links und Abstand zwischen
' den Abholstellen
End If
If i = 1 Then ' = 1 --> 2. Reihe
If j = 1 Then
xp = 300 + 40 * (j - 1)
Else
If j = 2 Then
xp = 300 + 200 * (j - 1)
Else
If j = 3 Then
xp = 300 + 100 * (j - 1) ' Abstand von links und Abstand
' zwischen den Abholstellen
Else
If j = 4 Then
xp = 300 + 350 * (j - 1)
Else
If j = 5 Then
xp = 300 + 450 * (j - 1)
End If
End If
End If
End If
End If
End If | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|