Seite 1 von 1

init:ClipLogger

Verfasst: 03.04.2014 12:24
von es_91

Code: Alles auswählen

EnableExplicit

Global Dim ImageField(8192, 0)
Global Window, ListIcon, Button
Define PreviousImage, PreviousText$

Procedure.d Max(Value.d, Maximum.d)
  If Value > Maximum
    ProcedureReturn Maximum
  EndIf
  ProcedureReturn Value
EndProcedure

Procedure NewText(Text$)
  AddGadgetItem(ListIcon, #PB_Any, "<text>" + Chr(10) + ReplaceString(Text$, Chr(10), Chr(0)))
EndProcedure

Procedure NewImage(Image)
  Protected Image$
  Image$ = GetTemporaryDirectory() + "image.bmp"
  SaveImage(Image, Image$)
  AddGadgetItem(ListIcon, #PB_Any, Chr(10) + FormatDate("%hh:%ii:%ss", Date()) + " " + Str(FileSize(Image$) / 1024) + " Kb", ImageID(Image))
EndProcedure

Procedure AskForImage()
  Shared PreviousImage
  Static PreviousImageWidth, PreviousImageHeight
  Protected Image, DifferenceInImage, ImageX, ImageY
  Image = GetClipboardImage(#PB_Any)
  If Image
    If IsImage(PreviousImage)
      PreviousImageWidth = ImageWidth(PreviousImage)
      PreviousImageHeight = ImageHeight(PreviousImage)
    EndIf
    If Not ImageWidth(Image) = PreviousImageWidth Or Not ImageHeight(Image) = PreviousImageHeight
      DifferenceInImage = #True
    Else
      StartDrawing(ImageOutput(Image))
      For ImageX = 0 To ImageWidth(Image) - 1
        For ImageY = 0 To ImageHeight(Image) - 1
          If Not Point(ImageX, ImageY) = ImageField(ImageX, ImageY)
            DifferenceInImage = #True
            Break 2
          EndIf
        Next
      Next
      StopDrawing()
    EndIf
    If DifferenceInImage
      NewImage(Image)
      StartDrawing(ImageOutput(Image))
      ReDim ImageField(8192, ImageHeight(Image))
      For ImageX = 0 To ImageWidth(Image) - 1
        For ImageY = 0 To ImageHeight(Image) - 1
          ImageField(ImageX, ImageY) = Point(ImageX, ImageY)
        Next
      Next
      PreviousImage = Image
      StopDrawing()
    EndIf
  EndIf
EndProcedure

Procedure AskForText()
  Shared PreviousText$
  Protected Text$
  Text$ = GetClipboardText()
  If Not Text$ = PreviousText$ And Not Text$ = ""
    NewText(Text$)
  EndIf
  PreviousText$ = Text$
EndProcedure

ExamineDesktops()

Window = OpenWindow(#PB_Any, DesktopWidth(#Null) - 240, 5, 230, DesktopHeight(#Null) - 80, "init:ClipLogger", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget)

StickyWindow(Window, #True)

ListIcon = ListIconGadget(#PB_Any, 0, 20, WindowWidth(Window), WindowHeight(Window) - 50, "Typ", 40, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(listicon, 1, "Value", 120)

Button = ButtonGadget(#PB_Any, 5, WindowHeight(Window)-25, 80, 20, "Reaktivieren")

Repeat
  Select WaitWindowEvent(10)
    Case #PB_Event_SizeWindow
      ResizeGadget(Button, 5, WindowHeight(Window)-25, 80, 20)
      ResizeGadget(ListIcon, 0, 20, WindowWidth(Window), WindowHeight(Window)-50)
      SetGadgetItemAttribute(ListIcon, #PB_Ignore, #PB_ListIcon_ColumnWidth, Max(40.0/190 * WindowWidth(Window), 65), 0)
      SetGadgetItemAttribute(ListIcon, #PB_Ignore, #PB_ListIcon_ColumnWidth, WindowWidth(Window) - GetGadgetItemAttribute(listicon, #PB_Ignore, #PB_ListIcon_ColumnWidth, 0) - 30, 1)
    Case ListIcon
      If EventType() = #PB_EventType_LeftDoubleClick
        Gosub FillClipboardWithSelectedText
      EndIf
    Case Button
      Gosub FillClipboardWithSelectedText
    Case #PB_Event_CloseWindow
      End
  EndSelect
  
  If Not GetGadgetState(ListIcon) = #PB_Any
    DisableGadget(Button, #False)
  Else
    DisableGadget(Button, #True)
  EndIf
  
  AskForImage()
  AskForText()
ForEver

End

FillClipboardWithSelectedText:
If Not GetGadgetState(ListIcon) = #PB_Any
  If GetGadgetItemText(ListIcon, GetGadgetState(ListIcon), 0) = "<text>"
    SetClipboardText(ReplaceString(GetGadgetItemText(ListIcon, GetGadgetState(ListIcon), 1), Chr(0), Chr(10)))
  Else
    Debug GetGadgetItemText(ListIcon, GetGadgetState(ListIcon), 1)
  EndIf
EndIf
Return
Dieses Programm hat einen Fehler. Es kann kein Text reaktiviert werden. Wer den Fehler findet, bekommt einen EIntrag in den Credits, sobald dieses kleine Projekt veröffentlicht wird! :lol:

Re: init:ClipLogger

Verfasst: 03.04.2014 12:50
von NicTheQuick
Das hat hier aber nichts in Feedback - Anwendungen zu suchen.
Bei mir kommt immer nur ein Fehler in Zeile 35:

Code: Alles auswählen

		If Not ImageWidth(Image) = PreviousImageWidth Or Not ImageHeight(Image) = PreviousImageHeight
Der tritt nicht auf, wenn ich immer Bilder in die Zwischenablage kopiere.

Übrigens ist '#PB_Any' zwar -1, aber trotzdem sollte man auch das nutzen, was in der Hilfe dokumentiert ist, nämlich -1. Auf einmal ändert sich der Wert von '#PB_Any' noch in irgendeiner PB-Version und dann kannst du Fehler suchen.

Ich verschiebe den Thread auch mal ins richtige Forum.

Re: init:ClipLogger

Verfasst: 03.04.2014 13:29
von hjbremer

Code: Alles auswählen

GetGadgetItemText(ListIcon, GetGadgetState(ListIcon), 1), Chr(0), Chr(10))
was macht das chr(0) da ???? und auch an anderer Stelle

Re: init:ClipLogger

Verfasst: 03.04.2014 16:14
von es_91
Danke, NicTheQuick!
NicTheQuick hat geschrieben:Bei mir kommt immer nur ein Fehler in Zeile 35:

Code: Alles auswählen

		If Not ImageWidth(Image) = PreviousImageWidth Or Not ImageHeight(Image) = PreviousImageHeight
Der tritt nicht auf, wenn ich immer Bilder in die Zwischenablage kopiere.
Ich kann mir nicht vorstellen, warum Du dort einen Fehler bekommst. Du musst also immer nur Bilder kopieren? Hm, das merke ich mir. Vielleicht hilft es später mal.
hjbremer hat geschrieben:

Code: Alles auswählen

GetGadgetItemText(ListIcon, GetGadgetState(ListIcon), 1), Chr(0), Chr(10))
was macht das chr(0) da ???? und auch an anderer Stelle
Sehr geehrter HJBremer,
in meinem Code werden Zeilenumbrüche, jedenfalls ihr erster Indikator, "Chr(10)", durch "Chr(0)" ersetzt, damit im ListIcon meines Programmes keine Zeilenumbrüche mehr dargestellt werden, sodass man den ganzen Text, der kopiert wurde, sieht, nicht nur den ersten Teil bis zum Zeilenumbruch.

Derartige Umwandlungen finden zweimal statt, einmal hin und einmal zurück.

/EDIT: Sie haben Recht, ich sollte sie durch Leerzeichen ersetzen! 8)

/EDIT2: Nein, das geht nicht. Dann ist eine Rückwärtskonvertierung nicht mehr möglich, ich kann ja nicht jedes Leerzeichen in einen Zeilenumbruch verwandeln. Fällt Ihnen auf die Schnelle ein sinnvolleres Zeichen, als "Chr(0)" ein?

Re: init:ClipLogger

Verfasst: 03.04.2014 16:21
von NicTheQuick
Um es genauer zu sagen bekomme ich diesen Fehler:
[ERROR] Das angegebene Image ist nicht initialisiert.
Anscheinend hat 'GetClipboardImage()' einen Bug unter Linux und gibt auch dann einen Wert ungleich 0 zurück, wenn es das lieber nicht tun sollte.
Nutzt man in Zeile 30 ein 'IsImage()' funktioniert alles bestens:

Code: Alles auswählen

	If IsImage(Image)
Das ist also nicht dein Fehler, wie es aussieht, sondern einer von PB.

Re: init:ClipLogger

Verfasst: 03.04.2014 16:24
von NicTheQuick
Übrigens fällt mir gerade erst auf, dass dein Eventhandling falsch ist. Du nutzt weder '#PB_Event_Gadget', noch 'EventGadget()' irgendwo. Ich denke mit dem Hinweis wirst du weiter kommen. ;)

Re: init:ClipLogger

Verfasst: 03.04.2014 18:03
von es_91
whooops :o

:D Damit bekommst Du einen Eintrag in den Credits. Schreib mich irgendwann mal an, falls Dir etwas daran liegt, dass Dein echter Name erwähnt wird.