Red de conocimiento informático - Aprendizaje de código fuente - Muestra todo el texto en el puntero del mouse

Muestra todo el texto en el puntero del mouse

Recientemente, cuando estaba escribiendo un programa en Delphi, descubrí que cuando el texto en el ListBox excede el rango de visualización, no se puede ver todo el contenido del texto. Esto es muy inconveniente, así que decidí. dejar que el mouse apunte resuelve este problema mostrando el texto completo en la ubicación a la que apunta.

Primero, necesitamos analizar el problema.

Sabemos que hay una función de cadena en el objeto ListBox Items. Podemos obtener el texto correspondiente al índice especificando el índice. Sabemos que hay una función Strings en el objeto ListBox Items, que puede obtener el texto correspondiente al índice especificando el índice, por lo que lo que debemos hacer es obtener el índice del puntero del mouse actual en el evento OnMouseMove para obtener el texto correspondiente al índice y utilice Sugerencia para mostrarlo. Entonces el punto es obtener el índice del puntero del mouse. Al mirar el archivo de ayuda, encontramos que hay una función ItemAtPos en el control ListBox, que puede devolver el índice señalado por el mouse. Una vez que encuentre esta función, resolver el problema será mucho más fácil

II Resolver el problema

En el formulario, agregue un control ListBox, establezca la propiedad ShowHint en True y luego agregue un Captura de control CommandButton, utiliza Sugerencia para mostrar texto.

Control CommandButton, establezca la propiedad Caption en FillListBox

Haga doble clic en el control Button y escriba el siguiente código

procedimiento TForm Button Click (Sender TObject)

//Escriba el siguiente código usando el archivo en el directorio ShowHint para llenar el archivo ListBox.System en el directorio para llenar el ListBox

var

SearchRec TSearchRec

nResultado entero

const

szFilePath = d \\windows\\system *

comenzar clic en el botón TForm (remitente)

Iniciar clic en el botón TForm (procedimiento del remitente Clic en el botón TForm (Remitente TObject)

szFilePath = d *

comenzar

//llenar ListBox

ListBox Clear

nResult = FindFirst(szFilePath faAnyFile SearchRec)

nResult = FindFirst(szFilePath faAnyFile SearchRec) ?//Buscar el primer archivo

p>

while nResult = do?//Si el valor de retorno es, significa que se encontró el archivo

comenzar

/Agregar el archivo encontrado en ListBox Se utiliza la función ExtractFilepath Extraer ruta del archivo

Elementos del ListBox Add(ExtractFilePath(szFilePath) + SearchRec Name)

nResult = FindNext(SearchRec)

nResult = FindNext(SearchRec) ? // Continuar buscando el siguiente archivo hasta que el valor de retorno no sea

end

end

Lo siguiente es la parte clave del código Agregue el siguiente código en el evento OnMouseMove del ListBox

procedimiento TForm ListBox MouseMove(Sender TObject Shift TS) Sender TObject ShiftTShiftState X Y Integer)

var.

nPos TPoint // Declarar nPos como tipo de TPoint

p>

nIndex Integer

comenzar

// Completar el Estructura nPos

// Dado que ItemAtPos usa las coordenadas del mouse en el ListBox para calcular la posición a la que apunta, necesitamos obtener las coordenadas del mouse en el ListBox. El evento OnMouseMove ya nos proporciona las coordenadas X Y del mouse en el ListBox.

p>

nPos x =X

nPos y =Y

// Usa la función ItemAtPos para devolver la posición del mouse en el ListBox

nIndex =ListBox ItemAtPos (nPos True)

si nIndex > entonces

ListBox Hint =ListBox Items Strings[nIndex] //Muestra el texto en la posición actual

end

Después de completar el código anterior, cuando el mouse apunta a cualquier elemento en el ListBox, puede mostrar el contenido del elemento. Este problema está relacionado con las indicaciones en pantalla. De forma predeterminada, el programa repite el mensaje en milisegundos, por lo que el mensaje solo se puede mostrar una vez. Este problema se puede solucionar modificando el tiempo de repetición del recordatorio. Agregue un control ApplicationEvents al formulario y agregue el siguiente código en el evento OnShowHint. El siguiente código

Procedimiento TForm ApplicationEvents ShowHint(var HintStr String

var CanShow Boolean var HintInfo THintInfo)

comenzar

HintInfo Reset. p> HintInfo ReshowTimeout = // Establezca el tiempo de espera de remostración en milisegundos

end

Modifique el tiempo de espera de remostración de Hint para que esta función sea más perfecta. Como puede ver, el código para implementar esta función es muy pequeño y muy simple, se puede hacer fácilmente usando solo una función ItemAtPos, eso es lo bueno de Delphi. Esa es la belleza de Delphi, pero como programador, no deberías conformarte con menos. Si está interesado en saber cómo ItemAtPos obtiene el índice del rango del puntero del mouse en un ListBox, siga leyendo.

Tres inspiraciones

Para entender cómo está escrito ItemAtPos en Delphi, primero debemos mirar cómo está escrito en la interfaz de Delphi. Para ver cómo se escribe la función ItemAtPos en Delphi, simplemente mantenga presionada la tecla Ctrl y haga clic en la función ItemAtPos con el mouse y automáticamente ubicará la función.

El código fuente es el siguiente

función TCustomListBox ItemAtPos (Pos TPoint existente booleano) Entero

var

Conteo entero

Count Integer

Cuenta el número de elementos en el ListBox. ItemRect TRect //El rango del elemento de registro

comienza

si PtInRect (ClientRect Pos), ¿entonces?//PtInRect es una función API que se utiliza para detectar si el rango señalado por Pos es en el medio del ListBox.

ClientRect aquí es el rango del ListBox inicial

Result = TopIndex //Establezca el valor de retorno al índice del primer elemento en el ListBox es

Count = Items Count. //Calcular el número total de elementos

while Resultado < Contar do //Si el valor del índice actual es menor que el número total, comienza el bucle

comenzar

Realizar (LB_GETITEMRECT Result Longint(@ItemRect)) ?//Enviar el mensaje LB_GETITEMRECT al control ListBox para obtener el rango del elemento actual

si PtInRect (ItemRect Pos) luego salir //Si sucede que el rango apunta by Pos está dentro del rango del elemento actual y luego salga de toda la función

Inc (Resultado) /> Agregar resultado al resultado

Si no existe, salga <. /p>

end

Result = //Si el rango indicado por Pos no está dentro del rango del ListBox entonces Salir

end

Result = //Si el rango indicado por Pos está entonces salir

end

Si el rango indicado por Pos no está dentro del rango del ListBox, salir

fin