Hotelsoftware - Umsetzung Zimmerplan - Mitarbeiter gesucht
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
ich will ja jetzt hier keinen Flame-Thread lostreten, aber für solche Art von
Projekten ist VB(.Net) geradezu prädestiniert.
Sicherlich kann man die reine Darstellung von Raumbelegungsplänen mit
einem ImageGadget realisieren, aber wenn's irgendwann mal darum geht,
mit Mausklick einzelne 'Gäste' anzuklicken, um weitere Informationen
anzuzeigen oder diese auf andere (Zeit-)Räume zu verschieben, würde ich
persönlich das mit Usercontrols umsetzen.
Grüße ... Kiffi
Projekten ist VB(.Net) geradezu prädestiniert.
Sicherlich kann man die reine Darstellung von Raumbelegungsplänen mit
einem ImageGadget realisieren, aber wenn's irgendwann mal darum geht,
mit Mausklick einzelne 'Gäste' anzuklicken, um weitere Informationen
anzuzeigen oder diese auf andere (Zeit-)Räume zu verschieben, würde ich
persönlich das mit Usercontrols umsetzen.
Grüße ... Kiffi
a²+b²=mc²
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
die frage ist ja, ob smateja mit VB.NET arbeiten kann/möchte...
mag sein, dass es in VB bequemer ist als in PB, wenn man beides gleich gut beherrscht und beide Umgebungen zur verfügung hat...
aber wenn man sich erst VB kaufen müsste und sich einarbeiten müsste
und für 2200 Betriebe das NET-framework installieren müsste, ggf. noch hardware verändern,
dann wäre ne native PB-lösung evtl. doch bequemer...
aber bitte diskutiere weiter mit, du hast mehr erfahrung mit PB im professionellen einsatz als ich.
mag sein, dass es in VB bequemer ist als in PB, wenn man beides gleich gut beherrscht und beide Umgebungen zur verfügung hat...
aber wenn man sich erst VB kaufen müsste und sich einarbeiten müsste
und für 2200 Betriebe das NET-framework installieren müsste, ggf. noch hardware verändern,
dann wäre ne native PB-lösung evtl. doch bequemer...
aber bitte diskutiere weiter mit, du hast mehr erfahrung mit PB im professionellen einsatz als ich.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
in der Tat: VB6 müsste man sich kaufen. Da es heute fast keinen HändlerKaeru Gaman hat geschrieben:aber wenn man sich erst VB kaufen müsste und sich einarbeiten müsste
und für 2200 Betriebe das NET-framework installieren müsste, ggf. noch hardware verändern,
dann wäre ne native PB-lösung evtl. doch bequemer...
mehr gibt, der VB6 verkauft, muss man einen der letzten Restposten bei
eBay ergattern. Bei VB.Net bin ich mir nicht ganz sicher, ob man mit der
kostenlosen Express-Version Usercontrols basteln kann. Und wenn man
noch keine Kenntnisse in VB(.Net) hat, dann ist der Umstieg auch nicht in
ein- zwei Tagen erledigt.
Ebenso muss man auch bedenken, dass ein VB-Programm im Gegensatz
zu PB auf dem Zielrechner installiert werden muss. In manchen Firmen
kann es vorkommen, dass das nicht so ohne weiteres erlaubt ist. Und
wenn auf dem Zielrechner ein Windows läuft, auf dem das Framework
nicht unterstützt wird (W95, W98?, ME?), dann hat man ohnehin schlechte
Karten (was man allerdings schon vor Projektbeginn überprüfen sollte).
Das sind sicherlich alles Nachteile, die gegen VB(.Net) und für PB
sprechen.
Ich will hier auch nicht behaupten, dass man einen Raumbelegungsplan
mit PB nicht hinbekommen würde. Aber man benötigt mehr Zeit, um
sowas zu entwickeln und zu pflegen (Bugfixes, neue Versionen, etc.). Da
Zeit bekanntlich auch Geld ist, dürfte dieses Argument für jemanden, der
seine Brötchen damit verdienen will (oder muss) ziemlich wichtig sein.
Siehe auch: http://www.purebasic.fr/german/viewtopi ... 343#129343
Grüße ... Kiffi
a²+b²=mc²
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
Jo, ein eigenes Gadget ist sicher die professionellste Lösung. Trotzdem
würde mir ein ImageGadget mit nem kleinen, feinen CallBack schon
reichen. So klicks auf das IG sind ja einfachstens abfragbar (natürlich
auch mit der Pos auf dem Gadget) und mit ein bisschen Koordinaten-
umrechnung (für Zoomen / Verschieben) sollte nicht allzu schwer sein.
Einziger Punkt, bei dem ich mir noch etwas Gedanken machen müsste,
wäre eine Scrollbar, wie das wohl am besten aussehen und funktionieren
würde.
Alles easy, nur mein Vorschlag
würde mir ein ImageGadget mit nem kleinen, feinen CallBack schon
reichen. So klicks auf das IG sind ja einfachstens abfragbar (natürlich
auch mit der Pos auf dem Gadget) und mit ein bisschen Koordinaten-
umrechnung (für Zoomen / Verschieben) sollte nicht allzu schwer sein.
Einziger Punkt, bei dem ich mir noch etwas Gedanken machen müsste,
wäre eine Scrollbar, wie das wohl am besten aussehen und funktionieren
würde.
Alles easy, nur mein Vorschlag
- atnheaderlen
- Beiträge: 2
- Registriert: 06.09.2006 12:39
- Wohnort: Europa
ich hatte da mal was gemacht. vielleicht hilft es?
man kann auch sicherlich direkte callbacks integrieren. bei mir ging es darum, bestimmte vorgaenge schnell nachvollziehen zu koennen.
Code: Alles auswählen
Global CG_01.l
Structure Belegung
BNr.l
ONr.l
BBe.l
BEn.l
EndStructure
NewList T.Belegung()
Structure Verlinkung
GNr.l
BNr.l
EndStructure
NewList L.Verlinkung()
Procedure CreateGrafik(SL.Belegung(),LL.Verlinkung(),WINNr.l,XStart.l,YStart.l,XWidth.l,YWidth.l)
ResetList(LL())
While NextElement(LL())
FreeGadget(LL()\GNr)
Wend
ClearList(LL())
ResetList(SL())
OpenGadgetList(CG_01)
While NextElement(SL())
BGID=ButtonGadget(#PB_Any,(XStart+(20*SL()\BBe)),(YStart+(20*SL()\ONr)),(SL()\BEn-SL()\BBe)*20,20,Str(SL()\BNr))
AddElement(LL())
LL()\GNr=BGID
LL()\BNr=ListIndex(SL())
Wend
EndProcedure
Procedure GetData(SL.Belegung())
For loop=1 To 10
AddElement(SL())
Read SL()\BNr
Read SL()\ONr
Read SL()\BBe
Read SL()\BEn
Next
EndProcedure
;- main
GetData(T())
OpenWindow(1, 0, 0, 800, 600, "Booking", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(1))
CG_01.l=ContainerGadget(#PB_Any, 50, 50, 700, 450,#PB_Container_Double)
CloseGadgetList()
BG_01.l=ButtonGadget(#PB_Any,50,510,700,80,"STARTBUTTON")
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
EventGadgetID=EventGadget()
Select EventGadgetID
Case BG_01
CreateGrafik(T(),L(),1,0,0,20,20)
Default
ResetList(L())
While NextElement(L())
If L()\GNr=EventGadgetID
MessageRequester("Gedrueckt","Eintrag :"+Str(L()\BNr))
EndIf
Wend
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
DataSection:
Data.l 1,1,1,9
Data.l 2,1,10,14
Data.l 3,1,14,17
Data.l 4,1,18,25
Data.l 5,2,10,19
Data.l 6,3,4,9
Data.l 7,3,10,15
Data.l 8,3,18,29
Data.l 9,4,10,29
Data.l 10,5,18,19
- FGK
- Beiträge: 249
- Registriert: 09.01.2005 14:02
- Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit - Wohnort: Augsburg
@smateja
Den Ansatz von atnheaderlen find ich schon recht gelungen.
Ich hab da mal was gesehen das ich recht geschmeidig fand
weil es recht toll aussieht aber leider nicht so übersichtlich
sein dürfte wie die bisherige Lösung deines Brötchengebers.
Aber trotzdem was hältst du von so was?
TCL/TK Demo Floorplan:

Gruß
FGK
Den Ansatz von atnheaderlen find ich schon recht gelungen.
Ich hab da mal was gesehen das ich recht geschmeidig fand
weil es recht toll aussieht aber leider nicht so übersichtlich
sein dürfte wie die bisherige Lösung deines Brötchengebers.
Aber trotzdem was hältst du von so was?
TCL/TK Demo Floorplan:

Gruß
FGK
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
Ok, ich habe mich etwas bemüht:
Klickt drauf rum.
Code: Alles auswählen
Macro HIWORD(Value)
((Value) >> 16)
EndMacro
Macro LOWORD(Value)
((Value) & $FFFF)
EndMacro
Structure PLANELEMENT
Visible.l
Row.l
ColumnStart.l
ColumnEnd.l
*Data
EndStructure
Structure PLANGADGET
GadgetID.l
RenderImg.l
*OldCB
HeadHeight.l
SideWidth.l
ColumnWidth.l
RowHeight.l
*elements ; first element
ElementsCount.l
EndStructure
Declare PlanRedraw(*pg.PLANGADGET)
Procedure.l _plangadgetcb(hwnd.l, message.l, wParam.l, lParam.l)
Protected *pg.PLANGADGET, Result.l, x.l, y.l
Protected Row.l, Column.l, w.l, h.l, *elem.PLANELEMENT
*pg = GetWindowLong_(hwnd, #GWL_USERDATA)
Result = 1
If *pg
Select message
Case #WM_LBUTTONDOWN
x = LOWORD(lParam)
y = HIWORD(lParam)
Column = (x - *pg\SideWidth) / *pg\ColumnWidth
Row = (y - *pg\HeadHeight) / *pg\RowHeight
*pg\ElementsCount + 1
*pg\elements = ReAllocateMemory(*pg\elements, SizeOf(PLANELEMENT) * *pg\ElementsCount)
*elem = *pg\elements + SizeOf(PLANELEMENT) * (*pg\ElementsCount - 1)
*elem\Row = Row
*elem\ColumnStart = Column
Case #WM_MOUSEMOVE
If wParam & #MK_LBUTTON
; dragging
x = LOWORD(lParam)
y = HIWORD(lParam)
Column = (x - *pg\SideWidth) / *pg\ColumnWidth
*elem = *pg\elements + SizeOf(PLANELEMENT) * (*pg\ElementsCount - 1)
*elem\ColumnEnd = Column
*elem\Visible = #True
PlanRedraw(*pg)
EndIf
Case #WM_LBUTTONUP
x = LOWORD(lParam)
y = HIWORD(lParam)
Column = (x - *pg\SideWidth) / *pg\ColumnWidth
*elem = *pg\elements + SizeOf(PLANELEMENT) * (*pg\ElementsCount - 1)
*elem\ColumnEnd = Column
*elem\Visible = #True
PlanRedraw(*pg)
EndSelect
EndIf
If Result And *pg
ProcedureReturn CallWindowProc_(*pg\OldCB, hwnd, message, wParam, lParam)
EndIf
ProcedureReturn Result
EndProcedure
Procedure.l CreatePlanGadget(x.l, y.l, width.l, height.l)
Protected *pg.PLANGADGET
*pg = AllocateMemory(SizeOf(PLANGADGET))
If Not *pg
ProcedureReturn #False
EndIf
*pg\RenderImg = CreateImage(#PB_Any, width, height, 32)
If IsImage(*pg\RenderImg)
*pg\GadgetID = ImageGadget(#PB_Any, x, y, width, height, ImageID(*pg\RenderImg))
If Not IsGadget(*pg\GadgetID)
FreeImage(*pg\RenderImg)
FreeMemory(*pg)
ProcedureReturn #False
EndIf
;setup callback
*pg\OldCB = SetWindowLong_(GadgetID(*pg\GadgetID), #GWL_WNDPROC, @_plangadgetcb())
SetWindowLong_(GadgetID(*pg\GadgetID), #GWL_USERDATA, *pg)
SetWindowPos_(GadgetID(*pg\GadgetID), GadgetID(*pg\GadgetID), 10, 10, 100, 100, #SWP_NOMOVE | #SWP_NOSIZE | #SWP_NOZORDER | #SWP_FRAMECHANGED)
Else
FreeMemory(*pg)
ProcedureReturn #False
EndIf
With *pg
\HeadHeight = 50
\SideWidth = 50
\ColumnWidth = 30
\RowHeight = 20
EndWith
ProcedureReturn *pg
EndProcedure
Procedure.l PlanGetGadget(*pg.PLANGADGET)
If *pg
ProcedureReturn *pg\GadgetID
EndIf
EndProcedure
Procedure PlanRedraw(*pg.PLANGADGET)
Protected w.l, h.l, x.l, y.l, z.l, w2.l
Protected *elem.PLANELEMENT
If *pg
w = ImageWidth(*pg\RenderImg)
h = ImageHeight(*pg\RenderImg)
StartDrawing(ImageOutput(*pg\RenderImg)) ;>
Box(0, 0, w, h, RGB(200, 200, 255))
Box(0, 0, w, *pg\HeadHeight, RGB(150, 150, 255))
Box(0, *pg\HeadHeight, *pg\SideWidth, h - *pg\HeadHeight, RGB(150, 150, 255))
For y = 1 To (h - *pg\HeadHeight) / *pg\RowHeight
Box(0, *pg\HeadHeight + y * *pg\RowHeight, w, 1, 0)
Next
For x = 1 To (w - *pg\SideWidth) / *pg\ColumnWidth
Box(*pg\SideWidth + x * *pg\ColumnWidth, 0, 1, h, 0)
Next
For z = 0 To *pg\ElementsCount - 1
*elem = *pg\elements + z * SizeOf(PLANELEMENT)
If *elem\Visible
x = *pg\SideWidth + *elem\ColumnStart * *pg\ColumnWidth
w2 = (*elem\ColumnEnd - *elem\ColumnStart + 1) * *pg\ColumnWidth
y = *pg\HeadHeight + *elem\Row * *pg\RowHeight
Box(x + 1, y + 1, w2 - 1, *pg\RowHeight - 1, RGB(100, 100, 200))
EndIf
Next
StopDrawing() ;<
SetGadgetState(*pg\GadgetID, ImageID(*pg\RenderImg))
EndIf
EndProcedure
OpenWindow(0, 20, 20, 500, 500, "test")
CreateGadgetList(WindowID(0))
pg = CreatePlanGadget(0, 0, 500, 500)
PlanRedraw(pg)
Repeat
event = WaitWindowEvent()
If event = #PB_Event_Gadget
If EventGadget() = PlanGetGadget(pg)
PlanRedraw(pg)
EndIf
EndIf
Until event = #PB_Event_CloseWindow