Problem mit CLICK! 2.03

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Thomas Frank
Rookie
Rookie
Beiträge: 8
Registriert: Mi, 20. Mär 2013 16:12

Problem mit CLICK! 2.03

Beitrag von Thomas Frank »

Hallo,

ich versuche gerade CLICK! zum Laufen zu bringen.

Leider erhalten ich einen Fehle:

Code: Alles auswählen

Xbase++ Version     : Xbase++ (R) Version 1.90.355
Betriebssystem      : Windows Vista 06.01 Build 07601 Service Pack 1
-----------------------------------------------------------------------
oError:args         :
          -> VALTYPE: C VALUE:  ▬\»×╚☺
          -> VALTYPE: D VALUE: 19800101
oError:canDefault   : N
oError:canRetry     : N
oError:canSubstitute: J
oError:cargo        : NIL
oError:description  : Parameter hat falschen Typ
oError:filename     :
oError:genCode      :          2
oError:operation    : < ▬\»×╚☺> - <19800101>
oError:osCode       :          0
oError:severity     :          2
oError:subCode      :          3
oError:subSystem    : BASE
oError:thread       :          1
oError:tries        :          0
-----------------------------------------------------------------------
CALLSTACK:
-----------------------------------------------------------------------
Aufgerufen von TD2JUL(48)
Aufgerufen von MAIN(450)
 
Anhand der Fehler habe ich mich zur Funktion GetFileTime(cFile) in xbase.prg durchgehangelt.

Code: Alles auswählen

FUNCTION GetFileTime(cFile)
LOCAL cCreation := SPACE(8), cAccess := SPACE(8), cWrite := SPACE(8)
LOCAL nKernel32Dll:=DllLoad("Kernel32.dll")
LOCAL nH := FOPEN(cFile, FO_READ+FO_SHARED )
LOCAL aTime := {}


   If nKernel32Dll > 0 .AND. nH # -1
      IF DllCall(nKernel32Dll, DLL_STDCALL, 'GetFileTime', nH, @cCreation, @cAccess, @cWrite) # 0
         AADD( aTime, cCreation )
         AADD( aTime, cAccess   )
         AADD( aTime, cWrite    )
        
      ENDIF
      DllUnload(nKernel32Dll)
   EndIf

   IF nH # -1
      FCLOSE(nH)
   ENDIF


Return aTime
Für mich sieht es so aus, als ob die Funktion einen falschen Wert (C VALUE: ▬\»×╚☺) anstelle eines Datums liefert.

Könnte das evtl. mit dem verwendeten Windows 7 64 Bit zusammen hängen?

Habe leider momentan keinen Plan, deswegen bitte ich Euch um Unterstützung.
Danke

Gruß aus Hessen
Frank
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Problem mit CLICK! 2.03

Beitrag von Werner_Bayern »

Servus Frank,

kenne zwar beide Funktionen nicht, aber lt. Quellcode liefert Dein GetFileTime ein Array zurück, kein Datum.

Was ist click!?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Problem mit CLICK! 2.03

Beitrag von brandelh »

CLICK kenne ich auch nicht, aber MSDN FileTime liefert ZEIGER (pointer) auf Strukturen des Typs FILETIME, das kann man nicht einfach als Datum setzen.
lpCreationTime [out, optional]
A pointer to a FILETIME structure to receive the date and time the file or directory was created. This parameter can be NULL if the application does not require this information.
viel einfacher wäre es die Xbase++ Funktion Directory() - Dateiverzeichnis in Array einlesen zu benutzen,
diese stellt alle Infos als Xbase Werte zur Verfügung. Außerdem ändert sie nicht den Wert für den letzten Zugriff ;-)

Oder du siehst dich mal bei Pablo um (http://www.xbwin.com) da gibt es einige Funktionen zu FileTime ... mit Xbase 2.00 liefert FileTime64() allerdings aktuell nicht zurück.
Gruß
Hubert
Thomas Frank
Rookie
Rookie
Beiträge: 8
Registriert: Mi, 20. Mär 2013 16:12

Re: Problem mit CLICK! 2.03

Beitrag von Thomas Frank »

Hallo,

CLICK! ist ein Source-Code-Formatierer, ähnlich Snap für Clipper. Scheint wohl keiner zu verwenden?
siehe http://www.xbaseforum.de/viewtopic.php?f=24&t=1609

Das da ein Array zurückkommt ist mir klar. Die Werte in dem Array müßten jedoch Ziffern in einem Charfeld sein, damit sie zu einem Datum werterverarbeitet werden können.

Das Problem ist wohl die Funktion DllCall() die hier nicht das Richtige zurückgibt.

Gibt es evtl. einen alternaitiven Source-Code-Formatierer, möglichst Freeware?

Gruß
Frank
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Problem mit CLICK! 2.03

Beitrag von brandelh »

Thomas Frank hat geschrieben:Die Werte in dem Array müßten jedoch Ziffern in einem Charfeld sein, damit sie zu einem Datum werterverarbeitet werden können.
Ich meine auch mal gesehen zu haben, dass ein Dateizugriffsdatum aus chr(Jahr)+chr(Monat)+(tag) ... gespeichert wurde, das entspricht aber nicht mehr dem aktuellen Windowsstand.

GetFileTime() füllt Parameter vom Typ FILETIME und diese müssen zu einer 64Bit QUAD zusammengebaut werden (die es in Xbase selbst nicht gibt).
In einer solchen FileTime 64 bit QUAD sind die vergangenen Sekunden seit 01.01.1601 in der Auflösung 100 Nano Sekunden gespeichert.
Für die Umrechnung braucht man mehrere API Funktionen, der Quellcode ist an dieser Stelle also völlig unbrauchbar geworden !

:arrow: http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Kann aber leicht mit DIRECTORY() verbessert werden. So werden alle nötigen Werte als Xbase++ Datentyp geliefert.

Hier ein Beispiel das Infos einer Datei abfragt:

Code: Alles auswählen

#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Inkey.ch"
#include "directry.ch"


procedure main
   local aFiles, cMaske, nAnz, x

   cMaske := "Drucktest.pdf" // Dateiname

   aFiles := directory(cMaske)
   nAnz   := len(aFiles)

   for x := 1 to nAnz
       ? padr(aFiles[x,F_NAME],20),transform(aFiles[x,F_SIZE],"999,999,999,999"),"Byte"
       ? "Write:  ",aFiles[x,F_WRITE_DATE],   aFiles[x,F_WRITE_TIME]
       ? "Create: ",aFiles[x,F_CREATION_DATE],aFiles[x,F_CREATION_TIME]
       ? "Access: ",aFiles[x,F_ACCESS_DATE],  aFiles[x,F_ACCESS_TIME]
       ?
       inkey(5)
   next
   inkey(10)
return
PS: Xbase 1.90.355 bzw. die neu 2.00 haben enorm an Funktionen zugelegt,
neuerdings sind auch immer die XbToolsIII dabei, da kann und sollte man wenn
möglich auf API Funktionen verzichten.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Problem mit CLICK! 2.03

Beitrag von AUGE_OHR »

Thomas Frank hat geschrieben:ich versuche gerade CLICK! zum Laufen zu bringen.

Anhand der Fehler habe ich mich zur Funktion GetFileTime(cFile) in xbase.prg durchgehangelt.

Code: Alles auswählen

FUNCTION GetFileTime(cFile)
LOCAL cCreation := SPACE(8), cAccess := SPACE(8), cWrite := SPACE(8)
LOCAL nKernel32Dll:=DllLoad("Kernel32.dll")
LOCAL nH := FOPEN(cFile, FO_READ+FO_SHARED )
LOCAL aTime := {}

   If nKernel32Dll > 0 .AND. nH # -1
      IF DllCall(nKernel32Dll, DLL_STDCALL, 'GetFileTime', nH, @cCreation, @cAccess, @cWrite) # 0
         AADD( aTime, cCreation )
         AADD( aTime, cAccess   )
         AADD( aTime, cWrite    )
      ENDIF
      DllUnload(nKernel32Dll)
   EndIf

   IF nH # -1
      FCLOSE(nH)
   ENDIF

Return aTime
Für mich sieht es so aus, als ob die Funktion einen falschen Wert (C VALUE: ▬\»×╚☺) anstelle eines Datums liefert.

Könnte das evtl. mit dem verwendeten Windows 7 64 Bit zusammen hängen?
das sieht nach meinem Code aus ... und ich habe doch Click ständig im Gebrauch ...

Ich habe mir das nun angesehen und muss bestätigen das es "so" nicht mehr läuft ... aber irgendwie lief es vorher und mein Click.EXE läuft doch ...
egal, ich habe gerade vor paar Tagen eine Lösung gepostet .

Code: Alles auswählen

// in GetFileTime() erweitern

         AADD( aTime, FTtoST(cCreation) )
         AADD( aTime, FTtoST(cAccess  ) )
         AADD( aTime, FTtoST(cWrite   ) )



// wandelt FileTime nach SystemTime um
FUNCTION FTtoST(cFileTime, lDay, lConvert)
LOCAL cConvertTime:=Space(16), cDate, dDate

  DEFAULT lDay TO .F., lConvert TO .T.

  /* Convert Time */
  IF DllCall("Kernel32.dll",DLL_STDCALL,"FileTimeToSystemTime", cFileTime, @cConvertTime)==0
    RETURN ""
  ENDIF
  IF lConvert==.F.
    RETURN cConvertTime
  ENDIF

  cDate:=Padl(LTrim(Str(Bin2w(SubStr(cConvertTime,1,2)))),4,"0")+;
         Padl(LTrim(Str(Bin2w(SubStr(cConvertTime,3,2)))),2,"0")+;
         Padl(LTrim(Str(Bin2w(SubStr(cConvertTime,7,2)))),2,"0")
  dDate:=StoD(cDate)
  cDate:=DtoC(dDate)

RETURN IF(lDay,CdoW(dDate)+" ","")+cDate+" "+;
   Padl(LTrim(Str(Bin2w(SubStr(cConvertTime, 9,2)))),2,"0")+":"+;
   Padl(LTrim(Str(Bin2w(SubStr(cConvertTime,11,2)))),2,"0")+":"+;
   Padl(LTrim(Str(Bin2w(SubStr(cConvertTime,13,2)))),2,"0")+":"+;
   Padl(LTrim(Str(Bin2w(SubStr(cConvertTime,15,2)))),2,"0")
und damit läuft es wieder.

Der Grund warum ich FileTime() geschrieben habe war das ich die Tools Function FileTime() ersetzen wollte die Click benutzt.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Problem mit CLICK! 2.03

Beitrag von brandelh »

und warum nimmst du nicht einfach die Funktion directory() ?
Alles was man in Xbase++ als PRG codiert, muss Alaska bei Updates verbessern,
API Funktionen muss man selbst verbessern ;-)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Problem mit CLICK! 2.03

Beitrag von AUGE_OHR »

brandelh hat geschrieben:und warum nimmst du nicht einfach die Funktion directory() ?
wie schon gesagt suchte ich eine Ersatz für die Tools Function FileTime() welche ich "so" schon hatte ... also habe ich die genommen.
gruss by OHR
Jimmy
Antworten