Seite 3 von 4

Verfasst: 26.01.2007 16:45
von Kaeru Gaman
:mrgreen: dafür dass du nich streiten willst warste aber ganz schön patzig... :wink:

Verfasst: 26.01.2007 17:10
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

Verfasst: 26.01.2007 17:14
von Kaeru Gaman
yo, sowas meinen wir ja mit "eigene fensterklasse" bzw. "selbstgemachtes gadget"

Verfasst: 26.01.2007 17:18
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

Verfasst: 26.01.2007 17:49
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.

Verfasst: 26.01.2007 18:57
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

Verfasst: 26.01.2007 22:24
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 :)

Verfasst: 29.01.2007 15:22
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.

Verfasst: 01.02.2007 18:39
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

Verfasst: 01.02.2007 19:43
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.