Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

procedure DoSomethingWithAGroupBox;

var i: integer;

begin

 with  AGroupBox do

for i := 0 to ControlCount - 1 do

if controls[i] is TEdit then

TEdit(controls[i]).text := 'Как насчет этого?';

end;

end;

Приведенный

выше пример будет работать, если элементом управления является TEdit или его наследник, например, TDBEdit или TMaskEdit. Все объекты могут быть приведены к типу одного из объектов, являющегося наследником базового типа (или им самим). Но не спешите приводить все к родительскому классу, родитель в данном случае здесь не подходит, поскольку он означает объект, который содержит сам себя.

Label

Как сделать бегущую строку?

Письмо читателя 

The_Sprite отвечает:

с помощью TLabel и TTimer. Пример:

procedure TForm1.Timer1Timer(Sender: TObject);

Const

 LengthGoString = 10;

 GoString = 'В конце строку желательно повторить,'+

' чтоб получить эффект кольцевого движения! В конце ст';

Const i: Integer = 1;

begin

 Label1.Caption:=Copy(GoString,i,LengthGoString);

 Inc(i);

 If Length(GoString)-LengthGoString < i then i:=1;

end;
 

ListBox 

Навигация в ListBox при множественном выборе

Тема: Навигация в ListBox при множественном выборе

Данный пример выводит сообщение для каждого элемента Listbox, выбранного пользователем.

procedure TForm1.Button1Click(Sender: TObject);

var Loop: Integer;

begin

 for Loop := 0 to Listbox1.Items.Count – 1 do begin

if listbox1.selected[loop] then ShowMessage(Listbox1.Items.Strings[Loop]);

 end;

end;
 

Внешние данные и ListBox

Delphi 2 

Мне необходимо создать Listbox с использованием внешних данных, хранимых в огромном (!) TStringList. Существует ли какое-нибудь системное сообщение, которое я мог бы перехватывать для получения данных Listbox из внешнего TStringlist?

Просматривая справочник по API, я нашел интересный пункт, который может помочь вам решить проблему: в Win32 вы можете создать Listbox со стилем LBS_NODATA:

(из описания CreateWindow:)

LBS_NODATA

Определяет ListBox со стилем no-data (без данных). Данный стиль необходимо

применять в случае, если количество элементов в ListBox превышает одну тысячу. no-data ListBox также должен иметь стиль LBS_OWNERDRAWFIXED, но не может иметь стиль LBS_SORT или LBS_HASSTRINGS.

no-data ListBox похож на owner-drawn ListBox за исключением того, что он не содержит в своих элементах строк и изображений (иконок). Команды добавления, вставки или удаления данных в элементах такого типа ListBox будут проигнорированы, а запросы для поиска строк всегда будут заканчиваться неудачей. При необходимости отрисовки данного элемента, Windows посылает родительскому окну сообщение WM_DRAWITEM. Член itemID стуктуры DRAWITEMSTRUCT, передаваемой с сообщением WM_DRAWITEM, определяет номер строки (элемент), который должен быть перерисован. no-data ListBox не посылает сообщение WM_DELETEITEM.

Количество элементов в таком списке вы можете установить с помощью сообщения LB_SETCOUNT. Это позволит вам создать «виртуальный» ListBox с очень небольшой загрузкой.

Чтобы воспользоваться новым стилем, вам нужно создать новый класс-наследник от TListbox и перекрыть метод CreateParams.

– Peter Below

Инкрементальный поиск в ListBox II

Я видел приложение, в котором ListBox позволял осуществлять инкрементальный поиск. При вводе очередного символа он позиционирует вас к первой ячейке, начало значения которой совпадает с введенным пользователем текстом, или выделяет все строки с текстом, содержащим введенный текст.

Как это осуществить на Delphi?

Здесь придется немного воспользоваться Win API. Установите свойство формы KeyPreview в True и сделайте примерно следующее:

unit LbxSrch;

interface

uses Windows, Messages, SysUtils, Classes, Controls, Forms, StdCtrls;

type TFrmLbxSrch = class(TForm)

 Edit1: TEdit;

 Edit2: TEdit;

 ListBox1: TListBox;

 Label1: TLabel;

 procedure FormKeyPress(Sender: TObject; var Key: Char);

 procedure ListBox1Enter(Sender: TObject);

private

 { Private declarations }

 FPrefix: array[0..255] of char;

public

 { Public declarations }

end;

varFrmLbxSrch: TFrmLbxSrch;

implementation

{$R *.DFM}

procedure TFrmLbxSrch.FormKeyPress(Sender: TObject; var Key: Char);

{ Помните о том, что свойство KeyPreview должно быть установлено в True }

Поделиться с друзьями: