Beiträge von BugFix
-
-
Hmm,
da steht der Oscar extra um 4 Uhr morgens auf zum Gratulieren, Respekt.
Also Vielen Dank für diese ersten Grüße und wie man sieht stimmt es: Das Internet vergißt nichts. (nicht mal Geburtstage)
(Das Geburtstagsdatum habe ich eigentlich nur aus einem recht leidigen Grund entfernt: Die Zunahme von Identitätsdiebstahl im INet. Aus einem Forum das Geburtsdatum geholt, über Denice noch Name und Anschrift des Users holen - wenn er 'ne Website hat - und schon kannst du auf dessen Kosten in jedem Versandhaus einkaufen.) -
-
Hi,
Edit 28.11.2011
aus der einen Funktion RepeatChar habe ich nun eine kleine Sammlung gemacht. Die Syntax habe ich auch etwas verändert.
Ich wollte mich erst an vi orientieren, habe nun aber eine eigene Syntax erstellt, die meines Erachtens nachvollziehbar ist.Edit 29.11.2011
Sry, war ein kleiner Bug drin - mit "!" wurde Sequenz aktiviert und nicht abgebrochen, wenn kein Zeichen einer Sequenz folgte - gefixt.
Neu: n-Worte links/rechts Löschen-- Generell: Kennzeichnung Operationen nach links(vorher): Kleinbuchstaben, nach rechts(hinterher): Großbuchstaben
-- Trigger für alle Operationen: "!seq"
--
-- Wiederholen n-mal...........seq: "!COUNTrCHAR"...."!5r*" = "*****"
-- Gehe n-Worte nach links.....seq: "!COUNTg"........"!5g" = 5 Worte nach links
-- Gehe n-Worte nach rechts....seq: "!COUNTG"........"!5G" = 5 Worte nach rechts
-- Lösche ein Wort links.......seq: "!w" ( w-Word )
-- Lösche ein Wort rechts......seq: "!W"
-- Lösche n-Worte links........seq: "!COUNTw"........"!5w" = 5 Worte links löschen
-- Lösche n-Worte rechts.......seq: "!COUNTW"........"!5W" = 5 Worte rechts löschen
-- Lösche Zeile nach links.....seq: "!l" ( l-Line )
-- Lösche Zeile nach rechts....seq: "!L"
-- Tausche Zeile mit voriger...seq: "!s" ( s-Swap )
-- Tausche Zeile mit nächster..seq: "!S"EditOperations.lua(0.4)
Code
Alles anzeigen-- TIME_STAMP 2011-11-29 10:02:12 v 0.4 -- by BugFix EvtOnChar = EventClass:new(Common) -------------------------------------------------------------------------------- -- OnChar(charAdded) -- -- Generell: Kennzeichnung Operationen nach links(vorher): Kleinbuchstaben, nach rechts(hinterher): Großbuchstaben -- Trigger operations by: "!seq" -- -- repeat n-times...............seq: "!COUNTrCHAR".."!5r*"....= "*****" -- go n-words left..............seq: "!Countg"......"!5g".....= 5 words to left -- go n-words right.............seq: "!CountG"......"!5G".....= 5 words to right -- delete one word left.........seq: "!w"..........."!w"......= one word left delete -- delete n-words left..........seq: "!COUNTw"......"!5w".....= 5 words left delete -- delete one word right........seq: "!W"..........."!W"......= one word right delete -- delete n-words right.........seq: "!CountW"......"!5W".....= 5 words right delete -- delete line to start.........seq: "!l" -- delete line to end...........seq: "!L" -- swap line with line before...seq: "!s" -- swap line with line after....seq: "!S" -- -- Parameters: -- charAdded - The character typed. -------------------------------------------------------------------------------- ------------------- Deklarationen --------------------------------------- -- Ausrufezeichen (exclamation mark) als Trigger für Operationen local fTrigger = false -- Warten auf Zahleneingabe nach Trigger local fGo = false -- Warten auf Repeat-Char local fRepeat = false -- Sammelstring Zahleneingabe local sNr = '' -- table sequences local tSeq = { ['w']='w',['W']='W',['l']='l',['L']='L',['g']='g',['G']='G',['s']='s',['S']='S',['r']='r' } -- table der Zahlen local tNum = { ['0']='0',['1']='1',['2']='2',['3']='3',['4']='4',['5']='5',['6']='6',['7']='7',['8']='8',['9']='9' } -- Zeichen, die (wenn Skript dafür aktiviert) paarig ausgegeben werden tPairs = { ['(']='(',['{']='{',['[']='[',['"']='"',["'"]="'" } ------------------------------------------------------------------------ ------------------------------------------------------------------------ function SetVarsBack() fTrigger = false fGo = false fRepeat = false sNr = '' end ------------------------------------------------------------------------ ------------------------------------------------------------------------ function SwapLine(_line, _direction) editor:BeginUndoAction() local caret = editor.CurrentPos local diff, pos, textSwap, lenSwap local textBase, lenBase = editor:GetLine(_line) if lenBase == nil then lenBase = 0 end if _direction == nil then _direction = 1 end textSwap, lenSwap = editor:GetLine(_line +(_direction)) if lenSwap == nil then lenSwap = 0 end editor:GotoLine(_line) pos = editor.CurrentPos diff = caret - pos editor:SetSel(pos, pos +lenBase) editor:ReplaceSel(textSwap) editor:GotoLine(_line +(_direction)) pos = editor.CurrentPos editor:SetSel(pos, pos +lenSwap) editor:ReplaceSel(textBase) editor:GotoLine(_line) editor:GotoPos(editor.CurrentPos + diff) editor:EndUndoAction() end ------------------------------------------------------------------------ ------------------------------------------------------------------------ function RepeatChar(_pos, _charAdded) editor:BeginUndoAction() editor:SetSel(_pos -(string.len(sNr) +3) , _pos) editor:ReplaceSel(string.rep(_charAdded, tonumber(sNr))) if tPairs[_charAdded] ~= nil then _pos = editor.CurrentPos editor:SetSel(_pos, _pos+1) editor:ReplaceSel('') end editor:EndUndoAction() SetVarsBack() end ------------------------------------------------------------------------ ------------------------------------------------------------------------ function DeleteSeq(_pos, _addLen) if _addLen == nil then _addLen = 0 end editor:SetSel(_pos -(2 +_addLen), _pos) editor:ReplaceSel('') end ------------------------------------------------------------------------ ------------------------------------------------------------------------ function EvtOnChar:OnChar(_charAdded) local pos = editor.CurrentPos if fRepeat == true then RepeatChar(pos, _charAdded) SetVarsBack() -- Zeichen sNr -mal wiederholen elseif fTrigger == true then -- Ausrufezeichen wurde vorher gesetzt, Trigger ist aktiv if tNum[_charAdded] ~= nil then -- Ziffer eingegeben if fRepeat == false and fGo == false then -- kein Repeat oder Go aktiv sNr = sNr..tNum[_charAdded] -- Ziffer zum Zahlenstring hinzufügen elseif fRepeat == true then -- diese Ziffer ist das zu wiederholende Zeichen RepeatChar(pos, _charAdded) SetVarsBack() -- Ziffer sNr -mal wiederholen end elseif tSeq[_charAdded] ~= nil then -- Zeichen einer Sequenz eingegeben, Aktion ausführen if _charAdded == 'w' then if sNr ~= '' then -- sNr -Worte links löschen DeleteSeq(pos, string.len(sNr)) for i = 1, tonumber(sNr) do editor:DelWordLeft() end else DeleteSeq(pos) editor:DelWordLeft() -- ein Wort links löschen end elseif _charAdded == 'W' then if sNr ~= '' then -- sNr -Worte rechts löschen DeleteSeq(pos, string.len(sNr)) for i = 1, tonumber(sNr) do editor:DelWordRight() end else DeleteSeq(pos) editor:DelWordRight() -- ein Wort rechts löschen end elseif _charAdded == 'l' then -- Zeile bis zum Anfang löschen editor:DelLineLeft() elseif _charAdded == 'L' then -- Zeile bis zum Ende löschen DeleteSeq(pos) editor:DelLineRight() elseif _charAdded == 's' then -- Zeile mit voriger tauschen DeleteSeq(pos) SwapLine(editor:LineFromPosition(pos), -1) elseif _charAdded == 'S' then -- Zeile mit nächster tauschen DeleteSeq(pos) SwapLine(editor:LineFromPosition(pos)) elseif _charAdded == 'g' or _charAdded == 'G' then -- gehe sNr -Worte nach links/rechts if sNr == '' then SetVarsBack() return end DeleteSeq(pos, string.len(sNr)) if _charAdded == 'g' then for i = 1, tonumber(sNr) do editor:WordLeft() end end if _charAdded == 'G' then for i = 1, tonumber(sNr) do editor:WordRight() end end elseif _charAdded == 'r' then -- Repeat aktivieren, nächstes Zeichen wird sNr -mal wiederholt fRepeat = true return false end SetVarsBack() else SetVarsBack() end end if _charAdded == '!' then fTrigger = true end -- Trigger wird aktiviert return false end --> EvtOnChar ------------------------------------------------------------------------Integration in SciTE:
- Das Skript im SciTE-Ordner speichern.
- Eintrag im "SciTEStartup.lua" vornehmen:LoadLuaFile("RepeatChar.lua")LoadLuaFile("EditOperations.lua")
Die Datei sollte dann etwa so aussehen:SciTEStartup.lua
Code
Alles anzeigen-- TIME_STAMP 2011-11-27 11:51:04 v 0.1 -------------------------------------------------------------------------------- -- SciTE startup script. -------------------------------------------------------------------------------- -- A table listing all loaded files. LoadLuaFileList = { } -------------------------------------------------------------------------------- -- LoadLuaFile(file, directory) -- -- Helper function for easily loading Lua files. -- -- Parameters: -- file - The name of a Lua file to load. -- directory - If specified, file is looked for in that directory. By default, -- this directory is $(SciTEDefaultHome)\Lua. -------------------------------------------------------------------------------- function LoadLuaFile(file, directory) if directory == nil then directory = props["SciteDefaultHome"] .. "\\Lua\\" end table.insert(LoadLuaFileList, directory .. file) dofile(directory .. file) end -- LoadLuaFile() -- Load all the Lua files. LoadLuaFile("Class.lua") -- Always load first. LoadLuaFile("Common.lua") -- Always load second. LoadLuaFile("AutoItPixmap.lua") LoadLuaFile("AutoHScroll.lua") LoadLuaFile("AutoItAutoComplete.lua") LoadLuaFile("LoadSession.lua") LoadLuaFile("AutoItIndentFix.lua") LoadLuaFile("EdgeMode.lua") LoadLuaFile("SmartAutoCompleteHide.lua") LoadLuaFile("Tools.lua") LoadLuaFile("AutoItTools.lua") LoadLuaFile("AutoItGotoDefinition.lua") --~ LoadLuaFile("AutoCloseBraces.lua") -- don't use together with "EdgingSelection.lua" -- Start up the events (Calls OnStartup()). EventClass:BeginEvents() -- Files are using EventClass must load after Events startup LoadLuaFile("AutoStampSaveVersion.lua") -- use Event: "OnBeforeSave" LoadLuaFile("MyDebug.lua") LoadLuaFile("EdgingSelection.lua") -- use Event: "OnKey" LoadLuaFile("EditOperations.lua") -- use Event: "OnChar"Anschließend SciTE neu starten (oder wenn vorhanden das ReloadStartup ausführen), dann ist das Tool aktiv.
-
Erinnert mich an eine Bastelei, die ich vor ~4,5 Jahren mal gemacht habe: Slide Window
-
Wir das Skript dadurch nicht bedeutend langsamer, wenn ich das so mache?
Kaum, denn schließlich ist jedes Control real ein Childwindow. Somit sollte es keine Rolle spielen, wenn du das ebenso händelst. -
Sag mal, hast du Angst davor, die Funktion aufzurufen?
Probier doch einfach aus und schau, was du als Ergebnis bekommst.
Bsp.
- dein Array1 (Quellordner) enthält: [datei1,datei2,datei3,datei4,datei5,datei6,datei7]
- dein Array2 (Zielordner) enthält: [datei1,datei2,datei3,datei4]Somit erwartest du als Ergebnis: "datei5,datei6,datei7" ==> Elemente, die NUR in Menge 1 vorkommen.
Ruf die Funktion auf:
[autoit]$ErgebnisArray = _GetIntersection($Array1, $Array2)
[/autoit]
Was sagt dir die Funktionsbeschreibung?ZitatAlles anzeigen; Description:: Aus 2 gegebenen Mengen werden ermittelt
; - die Schnittmenge (Elemente, die in beiden Mengen enthalten sind)
; - die Differenzmenge 1 (Elemente, die nur in Menge 1 vorkommen)
; - die Differenzmenge 2 (Elemente, die nur in Menge 2 vorkommen)
;.....
; Return Value(s): Erfolg 2D-Array [n][0]=Schnittmenge
; [n][1]=Differenzmenge 1
; [n][2]=Differenzmenge 2
Also ist das, was du suchst, im Ergebnissarry in der Spalte Nummer 2 (Index 1) zu finden.[ Ich frage mich ernsthaft, wozu ich meine Funktionen so präzise kommentiere. Wenn es keiner liest, kann ich mir den Aufwand auch sparen.
] -
-
Wenn du 2 1D-Arrays hast, kannst du diese z.B. hiermit vergleichen.
-
Hallo funkey,
ich habe die UDF mal um einen Parameter erweitert. Du kannst jetzt einen Funktionsnamen übergeben, der genutzt wird für die Verwendung der Funktion im OnEventMode. Ohne Funktionsnamen (Leerstring) arbeitet die Funktion, wie vorher.
Aber vielleicht kannst du mal draufschauen, warum es beim Beenden dann zu einem fehlerhaften Ende kommt. Soweit habe ich mich jetzt noch nicht in deinen Code hineingekniet.
Angehängt die geänderte OwnTab.au3 und das OnEvent-Bsp. -
Ich verwende HelpMaker, enthält auch noch einen schönen IconMaker

-
Liebe Mit-User,
ihr solltet euch entscheiden, was wir wollen:
- eure (möglicherweise mit Glaskugel erhaltene) Deutung von Threadhintergründen ist das Maß aller Dinge
oder
- der hier gepostete Inhalt ist gültig.Ich plädiere ganz klar für Letzteres (und lasse Ersteres nicht zu)!
Solange ein Thread nicht mit dem dort veröffentlichten Inhalt gegen unsere Regeln verstößt, werde ich ihn auch nicht schließen. Nicht aufgrund von Vermutungen.
Wenn eure Glaskugel sagt, dass dies ein Bot ist - dann bietet halt keinen Support. Aber meldet bitte nicht jeden Thread wegen eures "Bauchgefühls".Danke.
-
brauche nur die Schriftenauswahl.
[autoit]
Na dann rufst du eben nur_ChooseFont("Arial") ; oder welche Schriftart es sein soll
[/autoit]auf. Alle Parameter dieser Funktion sind optional - steht auch so in der Hilfe - Lesen bildet.

Ahh, mir schwant, was du meinst: Im Auswahl-Dialog soll nur die Schriftart stehen? Wenn du das möchtest,mußt du es selbst erstellen.
-
Warum um Himmels Willen verwendest du hier RegExp?
Da hast du nun schon das Glück, dass die Daten sauber geordnet in einer csv-Datei vorliegen und recht leicht in eine Array gelesen werden können - weshalb willst du das per RegEx lösen?
So kannst du alles in ein schönes 3D-Array lesen (Bsp. Datei ek.csv)
Spoiler anzeigen
[autoit]#include <File.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$sPath = '..\ek.csv'
Local $aAll
_FileReadToArray($sPath, $aAll)
Local $aStadt[$aAll[0]][7][4]
;~ $aStadt[X][0][0] = Stadt
;~ $aStadt[X][Y][0] = Ware
;~ $aStadt[X][Y][1] = Stufe
;~ $aStadt[X][Y][2] = Preis
;~ $aStadt[X][Y][3] = GewichtLocal $aSplit, $n
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $aAll[0]
$aSplit = StringSplit($aAll[$i], ',')
$aStadt[$i-1][0][0] = $aSplit[1] ; == Stadt
$n = 1
For $j = 2 To $aSplit[0] Step 4
$aStadt[$i-1][$n][0] = $aSplit[$j] ; == Ware
$aStadt[$i-1][$n][1] = $aSplit[$j+1] ; == Stufe
$aStadt[$i-1][$n][2] = $aSplit[$j+2] ; == Preis
$aStadt[$i-1][$n][3] = $aSplit[$j+3] ; == Gewicht
$n += 1
Next
Next; == Ausgabe in Konsole
[/autoit]
For $i = 0 To UBound($aStadt) -1
For $j = 1 To 6
$s = $aStadt[$i][0][0] & ' - ' & $aStadt[$i][$j][0] & ' - '
ConsoleWrite( $s & 'Stufe: ' & $aStadt[$i][$j][1] & @CRLF )
ConsoleWrite( $s & 'Preis: ' & $aStadt[$i][$j][2] & @CRLF )
ConsoleWrite( $s & 'Gewicht: ' & $aStadt[$i][$j][3] & @CRLF )
Next
Next -
ich habs noch nie versucht eine Datei in eine Dll zu packen, aber ist es wirklich so schwer? Bzw ist es schwerer als das was du da gemacht hast
Es ist nicht schwer Daten mit z.B. Ressouce-Editor in einer Dll zu verpacken - aber versuch das mal dynamisch zu machen, sprich bei deinem User im installierten Programm. Das geht in die Hose.
Wenn du z.B. ein Programm hast, das diverse Module verwaltet und für jedes Modul gibt es z.B. eine Bild auf der GUI, dann mußt du für ein neues Modul auch ein neues Bild nachladen können. Das macht dein Programm dynamisch.aber so muss man doch immer die .rbn neugeladen werden und wenn z.B. 20 Bilder, Musik etc drin ist dann wäre es doch schlecht die alle nochmal neu zu laden oder nicht
Mann muß doch nur das aktualisieren, was erneuert oder neu eingefügt werden soll.
doch was wäre wenn aus Zufall in dem Binärcode <xx.xx> drinstehen würde, dann würde, das was sicherlich durch StringRegExp returnt wird, durcheinander gebracht werden oder nicht
Das Programm generiert den Binärcode aus den angegeben Dateien, wie soll dann solch Mist drin stehen?

-
Kleine Frage: Lässt sich das denn eigendlich deaktivieren? Die Funktion regt mich immer auf, wenn ich ein Minus schreiben will (mache ich ansonsten mit dem Nummernblock) und dann wird eine Zeile auskommentiert.
Ja, das kannst du abschalten:
Öffne in SciTE--Optionen--Globale Einstellungsdatei (C:\Program Files\AutoIt3\SciTE\SciTEGlobal.properties)
Dort findest du folgenden Block:Code# User defined key commands user.shortcuts=\ Ctrl+Shift+V|IDM_PASTEANDDOWN|\ Ctrl+PageUp|IDM_PREVFILE|\ Ctrl+PageDown|IDM_NEXTFILE|\ KeypadPlus|IDM_EXPAND|\ KeypadMinus|IDM_BLOCK_COMMENT|\ Ctrl+F1|IDM_HELP_SCITE|
dann einfach die Zeile für Keypad Minus auskommentieren: -
wie der Parameter für das drucken war müsste man mal eben googln
Oder einfach mal in die Registry schauen.
Zu jedem Dateityp sind im CLASSES_ROOT unter Shell die Aufrufe (open, print etc.) hinterlegt.
Für Wordpad-Dokumente findest du den Aufruf unter folgendem Schlüssel:
HKEY_CLASSES_ROOT\Wordpad.Document.1\shell\print\command
also: '"Pfad_wordpad.exe" /p "Pfad_zu_druckende_Datei"' -
Hi,
mit FileInstall oder Speichern des Binärcodes von Ressourcen direkt im Skript kann ich nur eine vorher festgelegte Quantität und Qualität dieser Ressourcen verwenden. D.h., wenn ich z.B. ein Bild aktualisieren möchte, muß das Skript dann auch neu kompiliert werden.
Kann man natürlich umgehen, wenn man die Ressourcen auslagert. Dabei ist es jedoch nicht sehr schick, wenn eine Handvoll Dateien im Verzeichnis "rumlungern". Mit nur einer ist das doch viel eleganter.
Und um es so einfach, wie möglich handhaben zu können, sollte es auch nicht unbedingt in einer Dll landen.
Deshalb habe ich zwei Tools erstellt, einmal zum Einfügen/Austauschen von Ressourcen in einem Ressourcencontainer und einmal um gezielt Ressourcen aus diesem Container in eine Zieldatei zu installieren.
Das Erstellen des Containers kann per Kommandozeile oder GUI erfolgen. Bei der GUI-Variante ist sowohl Drag&Drop als auch Auswahl per FileOpenDialog (beides mit Mehrfachauswahl) möglich.
Soll eine Komponente aktualisiert werden: Container aufrufen mit der Komponente und ein Überschreibflag setzen.
Dateiname.Suffix der eingefügten Komponenten sind auch die Identifier um die jeweilige Komponente wieder abzurufen.
Es wird bei jedem Erstellen/Hinzufügen von Komponenten auf eventuell bereits vorhandene Doppel dieser Komponenten geprüft. Ist das Überschreibflag nicht gesetzt, bleiben die vorhandenen Versionen erhalten.
Wenn ihr mal vergessen habt, was eigentlich im Container enthalten ist: Mit "SourceFromContainer.exe <Ressourcendatei> LIST" werden die Identifier der Komponenten ausgelesen und in die Zwischenablage übergeben.
Für den Container verwende ich das Suffix *.rbn ( ressourcen binär ). Eine Ressourcencontainer ist folgendermaßen aufgebaut:
Das heißt also auch: NIEMALS eine Containerdatei mit SciTE öffnen! Bei kleineren Dateien mag das noch gehen, aber schon unter 100 kB ist der Binärstring deutlich länger als das, was SciTE verkraften kann. Es schmiert dann einfach ab.Es spielt keine Rolle, was ihr in den Container packt. Bilder, Texte für Controls, Sounddateien - alles kann rein. Nur sollte man das nicht als Bibliothek oder Mediathek betrachten. Dazu ist es nicht gedacht. Das kleine Gerümpel, das sonst im Programmverzeichnis dümpelt, soll einen Ruheplatz finden.

Erstellen eines Ressourcen Containers per Kommandozeile:
Spoiler anzeigen
[autoit]$sPathRessource = "C:\Users\Standard\Code_AutoIt\TEST\Ressourcencontainer\RessContainer1.rbn"
[/autoit] [autoit][/autoit] [autoit]
$sPathDigi = 'C:\Pict\digicam_blau_200x150.jpg'
$sPathNPP = 'C:\Pict\Ico\npp_64x64.ico'
$sPathVideo = 'C:\Pict\Ico\videocam_87x96.ico'RunWait("C:\Tools\SourceToContainer.exe " & $sPathRessource & " " & $sPathDigi & " " & $sPathNPP & " " & $sPathVideo)
[/autoit]SourceToContainer(0.1) Kommandozeile und GUI
[autoit]#Region - TimeStamp
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
; 2011-11-17 00:10:37 v 0.1
#EndRegion - TimeStamp
#include-once
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>#cs
[/autoit] [autoit][/autoit] [autoit]
MUSTER AUFRUF:
"..\SourceToContainer.exe <Ressourcendatei> <Quelldatei_1> <Quelldatei_2..n> [ optional: Überschreibflag = 1 ]"..\SourceToContainer.exe C:\bla\Ressource.rbn C:\Pict\picture1.jpg C:\Pict\picture2.jpg C:\Pict\picture3.jpg"
[/autoit] [autoit][/autoit] [autoit]
mit Überschreib-Flag
"..\SourceToContainer.exe C:\bla\Ressource.rbn C:\Pict\picture2.jpg 1"
#ce
;===============================================================================
; Script Name......: SourceToContainer.au3
; Description......: Quelldatei(en) als Binärstring in eine Ressourcendatei schreiben (neu erstellen od. hinzufügen/überschreiben), Dateityp (*.rbn) (RessourceBiNär)
; Dateiname.Suffix als Identifier
; Existiert eine Ressource bereits, wird diese bei gesetztem Überschreib-Flag überschrieben. Ohne Flag bleibt die vorhandene Version erhalten.
; Mit SourceFromContainer.au3 wird aus der Ressourcendatei dann die gewünschte Quelldatei wieder ausgelesen und installiert.
; AutoIt version...: 3.3.6.1
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================Global $sPathRess, $aFiles[1], $fOverwrite = False
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]; == Kommandozeilen-Variante
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
If $CMDLINE[0] Then ; == [1]=Pfad_Ressourcendatei; [2..[0]-1]=Pfade_Quelldateien; [[0]-1]=optional_Flag_Overwrite(1) - Default nicht gesetzt
$sPathRess = $CMDLINE[1]
ReDim $aFiles[$CMDLINE[0] -1]
For $i = 2 To $CMDLINE[0]
$aFiles[$i-2] = $CMDLINE[$i]
If $CMDLINE[$i] = 1 Then
$fOverwrite = True
ReDim $aFiles[$CMDLINE[0] -2]
ExitLoop
EndIf
Next
__AddOrCreateBin($sPathRess, $aFiles, $fOverwrite)
Exit
EndIf; == GUI-Variante
[/autoit] [autoit][/autoit] [autoit]
$hMain = GUICreate(' Ressourcencontainer Erstellen oder Dateien Hinzufügen', 600, 190, -1, -1, -1, $WS_EX_ACCEPTFILES)
GUICtrlCreateGroup(' Quelldatei(en) Pfad(e) ', 10, 10, 580, 60)
$inSource = GUICtrlCreateInput('', 20, 35, 525, 20)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
$btSource = GUICtrlCreateButton('...', 555, 35, 25, 20)
GUICtrlCreateGroup('', -99, -99, 1, 1)
GUICtrlCreateGroup(' Ressourcencontainer [ Zieldatei (*.rbn) ] ', 10, 80, 580, 60)
$inDest = GUICtrlCreateInput('', 20, 105, 525, 20)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
$btDest = GUICtrlCreateButton('...', 555, 105, 25, 20)
GUICtrlCreateGroup('', -99, -99, 1, 1)
$btRun = GUICtrlCreateButton('Start', 500, 155, 80, 20)
$cbOverwrite = GUICtrlCreateCheckbox(' Ressourcen, wenn bereits vorhanden, überschreiben', 20, 158, 300, 17)GUISetState()
[/autoit] [autoit][/autoit] [autoit]
WinSetOnTop($hMain, '', 1)While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case -3
Exit
Case $btSource
WinSetOnTop($hMain, '', 0)
$sRead = FileOpenDialog('Quelldatei(en)', @CommonFilesDir, 'Alle (*.*)', 7)
If $sRead <> '' Then
$aTmp = StringSplit($sRead, '|')
If $aTmp[0] = 1 Then
GUICtrlSetData($inSource, $sRead)
Else
$sRead = ''
For $i = 2 To $aTmp[0]
$sRead &= $aTmp[1] & '\' & $aTmp[$i] & '|'
Next
GUICtrlSetData($inSource, StringTrimRight($sRead, 1))
EndIf
EndIf
WinSetOnTop($hMain, '', 1)
Case $btDest
WinSetOnTop($hMain, '', 0)
$sRead = FileOpenDialog('Ressourcendatei', @CommonFilesDir, 'Ressource Binär (*.rbn)', 10)
If $sRead <> '' Then
If StringRight($sRead, 4) <> '.rbn' Then $sRead &= '.rbn'
GUICtrlSetData($inDest, $sRead)
EndIf
WinSetOnTop($hMain, '', 1)
Case $btRun
If GUICtrlRead($inSource) <> '' Then
$aFiles = StringSplit(GUICtrlRead($inSource), '|', 2)
If GUICtrlRead($inDest) <> '' Then
$sPathRess = GUICtrlRead($inDest)
If BitAND(GUICtrlRead($cbOverwrite), $GUI_CHECKED) Then $fOverwrite = True
__AddOrCreateBin($sPathRess, $aFiles, $fOverwrite)
Else
GUICtrlSetData($inDest, 'D E S T I N A T I O N !!!')
Sleep(600)
GUICtrlSetData($inDest, '')
EndIf
Else
GUICtrlSetData($inSource, 'S O U R C E !!!')
Sleep(600)
GUICtrlSetData($inSource, '')
EndIf
EndSwitch
WEndFunc __AddOrCreateBin($sPathRess, ByRef $aFiles, $fOverwrite=False)
[/autoit] [autoit][/autoit] [autoit]
Local $hFile, $bRead, $sToWrite = '', $sFileName, $sFileErr = '', $sMsg = "erstellt."
Local $n = UBound($aFiles), $nErr = 0, $aContent, $aExisting[1][2] = [[0]], $ret, $x
If StringRight($sPathRess, 4) <> '.rbn' Then $sPathRess &= '.rbn'
If FileExists($sPathRess) Then
$sToWrite = FileRead($sPathRess)
$sMsg = "erweitert."
; == Check ob Dateien bereits vorhanden
$aContent = StringSplit($sToWrite, @CRLF, 1)
For $i = 0 To UBound($aFiles) -1
$ret = __RessourceGetLine($aContent, __GetFileName($aFiles[$i]))
If $ret > 0 Then
$aExisting[0][0] += 1
ReDim $aExisting[$aExisting[0][0] +1][2]
$aExisting[$aExisting[0][0]][0] = $i
$aExisting[$aExisting[0][0]][1] = $ret
EndIf
Next
; == wenn Überschreibmodus und Doppel vorhanden ==> Doppel löschen durch Kopieren bleibender Inhalte in $sToWrite
If $fOverwrite And $aExisting[0][0] > 0 Then
Local $sTmpWrite = ''
For $i = 1 To $aContent[0] -3 Step 3
$x = 0
For $j = 1 To $aExisting[0][0]
If $aExisting[$j][1] = $i Then
$x = 1
ExitLoop
EndIf
Next
If $x = 0 Then
$sTmpWrite &= $aContent[$i] & @CRLF & $aContent[$i+1] & @CRLF & $aContent[$i+2] & @CRLF
EndIf
Next
$sToWrite = $sTmpWrite
EndIf
EndIf
For $i = 0 To UBound($aFiles) -1
If Not FileExists($aFiles[$i]) Then
$sFileErr &= $aFiles[$i] & @CRLF
$nErr += 1
ContinueLoop
EndIf
If $aExisting[0][0] > 0 Then
$x = 0
For $j = 1 To $aExisting[0][0]
If $aExisting[$j][0] = $i Then
$x = 1
ExitLoop
EndIf
Next
If ($x = 1) And (Not $fOverwrite) Then ; == Doppel u. kein $fOverwrite ==> nicht hinzufügen
$n -= 1 ; == Dateizähler für Msg
ContinueLoop
EndIf
EndIf
$hFile = FileOpen($aFiles[$i], 16) ; == es existieren Doppel, wenn $fOverwrite, wurden diese gelöscht ==> müssen neu hinzugefügt werden
$bRead = FileRead($hFile)
FileClose($hFile)
$sFileName = __GetFileName($aFiles[$i])
$sToWrite &= '<' & $sFileName & '>' & @CRLF & _ ; == <Name.Suffix>
$bRead & @CRLF & _ ; == Binärstring
'</' & $sFileName & '>' & @CRLF ; == </Name.Suffix>
Next
If $sToWrite <> '' Then
$hFile = FileOpen($sPathRess, 2)
FileWrite($hFile, $sToWrite)
FileClose($hFile)
EndIf
If Not $nErr Then
MsgBox(262208,"Ressourcen Container","Die Ressourcendatei " & @CRLF & $sPathRess & @CRLF & "wurde mit " & $n & " Datei(en) " & $sMsg)
Else
$sMsg = "Von " & $n & " Datei(en) waren " & $nErr & " Datei(en) unter dem angegebenen Pfad nicht vorhanden:" & @CRLF & $sFileErr & @CRLF & "Die Ressourcen Datei wurde "
Select
Case ($sToWrite = '') And ($n = $nErr)
$sMsg &= 'nicht erstellt!'
Case $sToWrite = ''
$sMsg &= 'ohne die angeführte(n) Datei(en) erstellt!'
Case ($sToWrite <> '') And ($n = $nErr)
$sMsg &= 'nicht erweitert!'
Case $sToWrite <> ''
$sMsg &= 'ohne die angeführte(n) Datei(en) erweitert!'
EndSelect
MsgBox(262192,"Ressourcen Datei - Fehler", $sMsg)
EndIf
EndFuncFunc __GetFileName($sFullPath)
[/autoit] [autoit][/autoit] [autoit]
Return StringTrimLeft($sFullPath, StringInStr($sFullPath, '\', 1, -1))
EndFuncFunc __RessourceGetLine(ByRef $aContent, $sSearch)
[/autoit]
Local $iLine = 0
For $i = 1 To $aContent[0] Step 3
If $aContent[$i] = '<' & $sSearch & '>' Then
$iLine = $i
ExitLoop
EndIf
Next
Return $iLine
EndFuncDateien aus dem Ressourcen Container in das TempDir installieren:
Spoiler anzeigen
[autoit]$sPathRessource = "C:\Users\Standard\Code_AutoIt\TEST\Ressourcencontainer\RessContainer1.rbn"
[/autoit] [autoit][/autoit] [autoit]
$sFileDigi = 'digicam_blau_200x150.jpg'
$sFileNPP = 'npp_64x64.ico'
$sFileVideo = 'videocam_87x96.ico'RunWait("C:\Tools\SourceFromContainer.exe " & $sPathRessource & " " & $sFileDigi & " " & @TempDir & "\" & $sFileDigi)
[/autoit]
RunWait("C:\Tools\SourceFromContainer.exe " & $sPathRessource & " " & $sFileNPP & " " & @TempDir & "\" & $sFileNPP)
RunWait("C:\Tools\SourceFromContainer.exe " & $sPathRessource & " " & $sFileVideo & " " & @TempDir & "\" & $sFileVideo)SourceFromContainer(0.1) Kommandozeile
[autoit]#Region - TimeStamp
[/autoit] [autoit][/autoit] [autoit]
; 2011-11-17 00:09:59 v 0.1
#EndRegion - TimeStamp#cs
[/autoit] [autoit][/autoit] [autoit]
MUSTER AUFRUF:
"..\SourceFromContainer.exe <Ressourcendatei> <Identifier-Ressource> <Installationspfad>""..\SourceFromContainer.exe C:\bla\Ressource.rbn picture1.jpg " & @TempDir & "\picture1.jpg"
[/autoit] [autoit][/autoit] [autoit]AUFLISTUNG der Ressourcen eines Containers:
[/autoit] [autoit][/autoit] [autoit]
"..\SourceFromContainer.exe <Ressourcendatei> LIST""..\SourceFromContainer.exe C:\bla\Ressource.rbn LIST"
[/autoit] [autoit][/autoit] [autoit]
schreibt Ressourcen-Identifier in die Zwischenablage:
Pict1.jpg
Message1.txt
Program1.ico
#ce;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Script Name......: SourceFromContainer.au3
; Description......: Binärstring (Dateiname.Suffix als Identifier) aus Ressourcendatei lesen und damit Zieldatei erstellen (neu erstellen od. hinzufügen/überschreiben)
; Ressourcencontainer [Dateityp (*.rbn)] muß mit SourceToContainer.au3 erstellt worden sein
; Ressourcen Identifier eines Containers lassen sich mit LIST in die Zwischenablage ausgeben
; AutoIt version...: 3.3.6.1
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================If $CMDLINE[0] Then ; == [1]=Pfad_Ressourcendatei; [2]=zu_verwendende_Datei_aus_dem_Container; [3]=Installationspfad
[/autoit]
Local $sPathRess, $sFileName, $sPathInstall, $aContent, $hFileOut, $sRessourcen = ''
$sPathRess = $CMDLINE[1]
If Not FileExists($sPathRess) Then Exit MsgBox(262192, 'Fehler', 'Quelldatei nicht vorhanden!')
$sFileName = $CMDLINE[2]
If $sFileName <> 'LIST' Then $sPathInstall = $CMDLINE[3]
$aContent = StringSplit(FileRead($sPathRess) , @CRLF, 1)
For $i = 1 To $aContent[0] -3 Step 3
If $sFileName = 'LIST' Then
$sRessourcen &= StringTrimLeft(StringTrimRight($aContent[$i], 1) , 1) & @CRLF
ContinueLoop
EndIf
If $aContent[$i] = '<' & $sFileName & '>' Then
$hFileOut = FileOpen($sPathInstall, 2+8+16)
FileWrite($hFileOut, Binary($aContent[$i+1]))
FileClose($hFileOut)
Exit
EndIf
Next
If $sFileName = 'LIST' Then Exit ClipPut($sRessourcen)
Exit MsgBox(262192, 'Fehler', '"' & $sFileName '" nicht im Ressourcencontainer enthalten!')
EndIfEdit 17.11.2011:
Hier mal noch ein Muster, wie man ein Skript gestalten kann, um die Ressourcen mit einem einfachen Kommandozeilenaufruf upzudaten oder zu erweitern.Spoiler anzeigen
[autoit]; == die Tools per FileInstall im Skript verfügbar machen
[/autoit] [autoit][/autoit] [autoit]
FileInstall("C:\Tools\SourceToContainer.exe", @TempDir & "\SourceToContainer.exe")
FileInstall("C:\Tools\SourceFromContainer.exe", @TempDir & "\SourceFromContainer.exe")
Local $STCexe = @TempDir & "\SourceToContainer.exe" ; == für Updates und Hinzufügen von Ressourcen
Local $SFCexe = @TempDir & "\SourceFromContainer.exe" ; == zum Laden der Ressourcen; == Pfad Ressourcencontainer
[/autoit] [autoit][/autoit] [autoit]
Local $sPathRessource = @ScriptDir & "\RessContainer1.rbn"; == UPDATEN von Ressourcen, Kommandozeilenaufruf: "Skript.exe UPDATE <Pfad_zur_neuen_Version_von_Datei_1> <Pfad_zur_neuen_Version_von_Datei_2...n>"
[/autoit] [autoit][/autoit] [autoit]
; == HINZUFÜGEN von neuen Ressourcen, analog: "Skript.exe ADD <Pfad_zur_Datei_X> <Pfad_zur_Datei_Y...n>"
If $CMDLINE[0] Then
If StringInStr('UPDATE ADD', $CMDLINE[1]) Then
Local $sCmd = $STCexe & " " & $sPathRessource
For $i = 2 To $CMDLINE[0]
$sCmd &= " " & $CMDLINE[$i]
Next
If $CMDLINE[1] = 'UPDATE' Then $sCmd &= " 1"
RunWait($sCmd)
EndIf
EndIf; == alle Identifier des Containers in Zwischenablage laden und als Array speichern
[/autoit] [autoit][/autoit] [autoit]
RunWait($SFCexe & " " & $sPathRessource & " LIST")
Local $aIdentifier = StringSplit(ClipGet(), @CRLF, 1); == alle Ressourcen des Containers im TempDir installieren
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $aIdentifier[0]
RunWait($SFCexe & " " & $sPathRessource & " " & $aIdentifier[$i] & " " & @TempDir & "\" & $aIdentifier[$i])
Next#region - Skript
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
; ....
; ....
; ....
#endregion; == bei Beenden Skript sollte man die Dateien wieder löschen
[/autoit]
For $i = 1 To $aIdentifier[0]
FileDelete(@TempDir & "\" & $aIdentifier[$i])
Next
FileDelete($STCexe)
FileDelete($SFCexe) -
eine weit schnellere eingabe in Spielen als mit MouseMove hinbekommen kann
Forenregeln! beachten. Für Spielebots gibt es keinen Support.[CLOSED]
-