Hotelsoftware - Umsetzung Zimmerplan - Mitarbeiter gesucht

Du brauchst Grafiken, gute Programme oder Leute die dir helfen? Frag hier.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

:mrgreen: dafür dass du nich streiten willst warste aber ganz schön patzig... :wink:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

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
a²+b²=mc²
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yo, sowas meinen wir ja mit "eigene fensterklasse" bzw. "selbstgemachtes gadget"
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Kaeru Gaman hat geschrieben:yo, sowas meinen wir ja mit "eigene fensterklasse" bzw. "selbstgemachtes gadget"
yipp, ist mir klar. Allerdings differieren wir ein wenig in Bezug auf die
einzusetzende Programmiersprache ;-)

Grüße ... Kiffi
a²+b²=mc²
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Kaeru 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... ;)
in der Tat: VB6 müsste man sich kaufen. Da es heute fast keinen Händler
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²
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

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 :)
Benutzeravatar
atnheaderlen
Beiträge: 2
Registriert: 06.09.2006 12:39
Wohnort: Europa

Beitrag von atnheaderlen »

ich hatte da mal was gemacht. vielleicht hilft es?

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
man kann auch sicherlich direkte callbacks integrieren. bei mir ging es darum, bestimmte vorgaenge schnell nachvollziehen zu koennen.
Benutzeravatar
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

Beitrag von FGK »

@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:
Bild


Gruß

FGK
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Ok, ich habe mich etwas bemüht:

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
Klickt drauf rum.
Antworten