init:ClipLogger

Für allgemeine Fragen zur Programmierung mit PureBasic.
es_91
Beiträge: 411
Registriert: 25.01.2011 04:48

init:ClipLogger

Beitrag 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:
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: init:ClipLogger

Beitrag 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.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: init:ClipLogger

Beitrag 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
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
es_91
Beiträge: 411
Registriert: 25.01.2011 04:48

Re: init:ClipLogger

Beitrag 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?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: init:ClipLogger

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: init:ClipLogger

Beitrag 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. ;)
es_91
Beiträge: 411
Registriert: 25.01.2011 04:48

Re: init:ClipLogger

Beitrag 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.
Antworten