![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
|||
|
|||
|
Lepe: Probaré tu Código
No se bien a que te refieres cuando dices que no sabes bién lo que estoy usando; si te refieres al compilador utilizo Delphi 2006; si te refieres al código es tal y como lo escribí en el mensaje anterior; tengo un ShellTreeview linkado a un ShellListview y desde éste último selecciono un fichero en concreto.
Shelllistview.SelectedFolder.PathName me devuelve la ruta completa de "un" fichero, ¿No es asi?; de hecho si utilizo extractfilename(shelllistview.selectedforlder.pathname) me devuelve el nombre del fichero seleccionado; ademas si fuera como tu dices... if (hfile=invalid_handle_value) ¿no devolvería True? No obstante probaré el código que me envías (en estos momentos no tengo tiempo). ¿Podrías decirme donde encuentro una buena referencia sobre sysutils? ¿Porqué razón es necesario multiplicar nfilesizehigh por MAXCARDINAL? No se si todo esto es abusar mucho de vuestra paciencia, pero de todos modos muchas gracias. Saludos. ![]() |
|
#2
|
||||
|
||||
|
Reconozco que no he usado mucho los controles ShellTreeview y ShellListView, por tanto, al ver en tu codigo SelectedFolder.PathName, creía que el objeto seleccionado era una carpeta en lugar de un archivo.
Sobre sysutils, deberías tenerlo en el "uses" de tu formulario, es simplemente una unidad que tienes que usar para que reconozca la constante MAXCARDINAL. El hecho de multiplicar por MAXCARDINAL, es por definición de la API de windows, no usan un tipo de datos Int64 (que es mucho mayor que un DWORD), así que dividen ese valor en 2 valores, la parte alta (filesizeHigh) y la parte baja (filesizeLow). Imagina que queremos guardar un valor de 8 bits pero solo tenemos registros de 4 bits. En este caso queremos guardar el valor 130, la forma de dividirlo en dos partes sería así: 130 equivale en binario a: 10000010 , pero son 8 bits (8 digitos) Como tenemos solo 4 bits, lo dividimos en 2 partes: - por un lado la parte alta (los 4 bits de la izquierda) 1000 - y por el otro la parte baja (los 4 bits de la derecha) 0010 Si miras independientemente los valores, 1000 equivale a 8 en decimal, y 0010 equivale a 2 en decimal, que obviamente no es el 130 que queríamos guardar. En este caso, el máximo número que se puede almacenar con 4 bits sería 2^4 - 1 , es decir 16 valores, desde el cero hasta el quince, para poder sacar el valor real, la formula a usar es: Código:
parte_alta * 16 + parte_baja
8 * 16 + 2 = 130
Un número DWORD usa 32 bits; un Int64 usa 64 bits, justo el doble de bits, por tanto dividen el Int64 en dos DWORD, y no hay más remedio que usar la formula de marras .Es un truco muy usado en la API de windows. Saludos.
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
|
#3
|
|||
|
|||
|
Gracias Lepe, ya veo que te has esmerado en tu respuesta.
Lamentablemente tengo problemas con el compilador, (se me cuelga al iniciarlo) y tengo que reinstalarlo. En cuanto lo haga probaré las cuestiones que me comentas. ![]() |
|
#4
|
|||
|
|||
|
¿De donde saco MAXCARDINAL?
He intentado utilizar la variable MAXCARDINAL y me el siguiente error de compilacion:
[error]Unit1.pas(124):E2003 Undeclared identifier:'MAXCARDINAL' Este es el código que utilizo: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, ComCtrls, ShellCtrls, StdCtrls; type ........ ........ ....... TForm1 = class(TForm) Panel1: TPanel; ....... ....... ....... procedure Button4Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var ......... ......... ........ implementation uses Unit2; {$R *.dfm} procedure TForm1.Button4Click(Sender: TObject); begin Edit1.Text:=inttostr(MAXCARDINAL) end; Mirando en en la ayuda de sysutils solo encuentro las variables: <SPAN class=listedLink> |
|
#5
|
|||
|
|||
La pregunt continúa: He mirado en la ayuda y solo encuentro las variables de sysutils: Falseboolstr Trueboolstr y las constantes: Datedelta Unixdatedelta ¿Ya no está declarada MAXCARDINAL en la version 2005? Agradeceria cualquier respuesta. Saludos: ![]() |
|
#6
|
||||
|
||||
|
Pues tienes toda la razón, me equivoqué del todo
Es la constante MAXDWORD que realmente tambien guarda el máximo de un cardinal, ya que es el mismo tipo. La unidad es Windows. Saludos y lamento las molestias. PD: Creo que me estoy oxidando un poco, igual es la vejez ![]()
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
|
#7
|
|||
|
|||
|
No te preocupes Lepe, agradezco tu ayuda. He buscado esa variable y efectivamente esta ahi; tiene el valor 4.294.967.295 ¿No es asi?.
De todos modos aún no consigo sacar nada de Delphi que funcione como es debido; todavía me queda un carro por aprender. Gracias de Nuevo: ![]() |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Ficheros .dat y .idx | fjcg02 | Tablas planas | 11 | 29-01-2015 14:38:36 |
| Uso de ficheros CSV | ramonibk | Varios | 6 | 30-12-2004 10:28:35 |
| Ficheros *.dcu | neon | Varios | 1 | 24-08-2004 11:19:55 |
| ficheros idx y dat | User_Baja_2 | Varios | 1 | 26-05-2004 22:00:40 |
| Ficheros .dat & .idx | maro | Conexión con bases de datos | 4 | 10-02-2004 19:35:35 |
|