begin
…
withTMyGroupBox(GroupBox1).Canvas do
CopyRect(ClipRect, Image1.Canvas, ClipRect);
…
end;
– Ralph Friedman
Доступ к компонентам GroupBox
Одно из свойств всех элементов управления – указатель на другие элементы, которые он содержит. Это свойство – свойство Controls, которое индексируется наподобие массива. Количество элементов управления содержится в свойстве ControlCount. Если вы хотите получить доступ к свойству или методу, которого нет у TControl, вам неоходимо осуществить приведение типа элемента списка.
procedureDoSomethingWithAGroupBox;
vari: integer;
begin
with AGroupBox do
fori := 0 toControlCount - 1 do
ifcontrols[i] isTEdit then
TEdit(controls[i]).text := 'Как насчет этого?';
end;
end;
Приведенный выше пример будет работать, если элементом управления является TEdit или его наследник, например, TDBEdit или TMaskEdit. Все объекты могут быть приведены к типу одного из объектов, являющегося наследником базового типа (или им самим). Но не спешите приводить все к родительскому классу, родитель в данном случае здесь не подходит, поскольку он означает объект, который содержит сам себя.
Как сделать бегущую строку?
The_Spriteотвечает:
с помощью TLabel и TTimer. Пример:
procedureTForm1.Timer1Timer(Sender: TObject);
Const
LengthGoString = 10;
GoString = 'В конце строку желательно повторить,'+
' чтоб получить эффект кольцевого движения! В конце ст';
Consti: Integer = 1;
begin
Label1.Caption:=Copy(GoString,i,LengthGoString);
Inc(i);
IfLength(GoString)-LengthGoString < i theni:=1;
end;
Навигация в ListBox при множественном выборе
Тема: Навигация в ListBox при множественном выборе
Данный пример выводит сообщение для каждого элемента Listbox, выбранного пользователем.
procedureTForm1.Button1Click(Sender: TObject);
varLoop: Integer;
begin
forLoop := 0 toListbox1.Items.Count – 1 do begin
if listbox1.selected[loop] thenShowMessage(Listbox1.Items.Strings[Loop]);
end;
end;
Мне необходимо создать 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 и сделайте примерно следующее:
Читать дальше