Здравствуйте, уважаемые эксперты !!! 1) Вот в Инете выискал процедуру для смены цвета курсора у сетки, но текст в фокусе отображается в левом верхнем углу (это понятно ведь Rect.Left, Rect.Top), а как бы его по центру выводить, ведь Rect.Center не существует ??? procedure TForm1Main.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState); begin if gdFocused in State then with (Sender as TDBGrid).Canvas do begin Brush.Color := clRed; FillRect(Rect); TextOut(Rect.Left, Rect.Top, Field.AsString); end; end;
2) Как можно одновременно выводить русское сообщение, как у MessageBox, и картинку в этом сообщении, как у MessageDlg не создавая дополнительных форм ??? 3) А есть ли возможность преобразовать PChar в String и наоборот
??? А то хотелось бы использовать что-то на подобие: MessageBox(0, 'Номер' + edtNomer.Text, 'Заголовок', MB_OK); а то здесь не соответсвие типов. Всем заранее большое спасибо! С уважением SATAN aka NAPALM.
1) Для вывода центрированного текста используй функцию DrawText - у неё СТОЛЬКО возможностей!.. 2) Почитай доку по MessageBox, используй MB_ICONERROR, MB_ICONINFORMATION, ... 3) Просто преобразовывай к типу PChar - об остальном позаботится компилятор:
MessageBox(0, PChar('Найдено '+IntToStr(Deff)+' отличий. Продолжить?','Уведомление',MB_YESNO or MB_ICONCONFIRMATION);
Ответ отправлен: 02.09.2003, 23:20 Отправитель: Артём Шегеда Отвечает Delphist
Здравствуйте, SATAN aka NAPALM! 1) Нужно знать ширину и высоту текста и тогда можно сделать что-нибудь в этом роде: TextOut(Rect.Left+(Rect.Right-rect.left-textwindth)div 2, Rect.Top+(Rect.bottom-rect.top-textheight) div 2, Field.AsString); Узнать ширину текста можно так - поставить моноширинный шрифт (например courier), откопать в WinAPI функцию нахождения ширины символа (она там есть, только не помню как называется), подсунуть ей любой символ этого шрифта, а потом умножить на кол-во символов в тексте. На счет функции определяющей высоту текста не знаю - на проверял, но на крайняк - в теории высота символа 12 шрифта равна 12/72 дюйма умножаем на dpi экрана - получаем высоту в пикселях. 3) Легко. Читай help по StrPas (Pchar в string) и StrPCopy (наоборот).
Ответ отправлен: 02.09.2003, 17:14 Отправитель: Delphist Отвечает URiS
Приветствую Вас, SATAN aka NAPALM! 3) Пишешь так MessageBox(0, PChar('Номер' + edtNomer.Text, 'Заголовок'), MB_OK);
Ответ отправлен: 03.09.2003, 18:55 Отправитель: URiS Отвечает _vt
Здравствуйте, SATAN aka NAPALM! 2) Существует несколько предопределенных в системе мессаджбоксов: MT_ERROR,MT_INFORMATION, MT_XXXX(ну в таком духе... :-)) Выводить их надо так: MessageBox(NULL, 'Текст', 'Заголовок', MB_OK or MB_INFORMATION); 3) Попробуй просто: (pchar)edtNomer.Text или edtNomer.Text[Length(text)]:=#0;
---===*** Updated E-Man 1.5 - it's cool!***===---
Ответ отправлен: 02.09.2003, 22:49 Отправитель: _vt Отвечает ART_43
Приветствую Вас, SATAN aka NAPALM! 1) Расчитывай Rect через TextWidth, TextHeight 3) PChar(StringVariable), String(PCharVariable) Ответ отправлен: 04.09.2003, 14:10 Отправитель: ART_43 Отвечает Cybernetic Creature
Добрый день, SATAN aka NAPALM! otvechu na 3) .... var s:string;p:PChar; .... MessageBox(....+PChar(edtNomer.Text),....); Ответ отправлен: 02.09.2003, 22:01 Отправитель: Cybernetic Creature Отвечает Marouder
Доброе время суток, SATAN aka NAPALM! 1) Ну посчитай сам где находится центр. Rect.Right и Rect.Bottom разделить на два трудно? 2) Не понял вопроса. А MessageDlg разве не выводит русские сообщения? 3) Конечно. Сам намучился с этим давно, когда начинал программировать в Delphi. Типы можно приводить: MessageBox(0, PChar('Номер' + edtNomer.Text), 'Заголовок', MB_OK);
Ответ отправлен: 03.09.2003, 13:07 Отправитель: Marouder
Вопрос № 886
Ув. эксперты Есть алгоритм сортировки Шелла {===== Пpогpаммный пpимеp =====} { Соpтиpовка Шелла } Procedure Sort(var a : seq); Var d, i, t : integer; k : boolean; { пpизнак пеpестановки } begin d:=N div 2; { начальное значение интеpвала } while d>0 do begin { цикл с yменьшением интеpвала до 1 } { пyзыpьковая соpтиpовка с интеpвалом d } k:=true; while k do begin { цикл, пока есть пеpестановки } k:=false; i:=1; for i:=1 to N-d do begin { сpавнение эл-тов на интеpвале d } if a[i]>a[i+d] then begin t:=a[i]; a[i]:=a[i+d]; a[i+d]:=t; { пеpестановка } k:=true; { пpизнак пеpестановки } end; { if ... } end; { for ... } end; { while k } d:=d div 2; { yменьшение интеpвала } end; { while d>0 } end; так
вот при сортировке массива в 4000 элементов, он выполняется медленнее, чем аллгоритм быстрой сортировки, хотя должно быть наоборот {Быстрая сортировка} procedure QuickSort(var Mas: iArray; LowIndex, HiIndex: Byte); var i,j,Mid: Byte; TestVal: Integer; TempItem:Integer; begin if LowIndex Begin {Определяем индекс серидины массива} Mid:=Round((LowIndex+HiIndex)/2); {Присваеваем переменной TestVal значение хранящиеся в массиве под индесом Mid} TestVal:=Mas[Mid]; i:=LowIndex; j:=HiIndex; repeat {Пока значение элемента массива с индексом i меньше TestVal увеличиваем индекс i Иначе выход из цикла While} while Mas[i] inc(i);
{Пока значение элемента массива с индексом j больше TestVal увеличиваем индекс j Иначе выход из цикла While} while Mas[j]>TestVal do dec(j); if i<=j then begin TempItem:=Mas[j]; Mas[j]:=Mas[i]; Mas[i]:=TempItem; inc(i); dec(j); end; until i>j; {Вначале сортируется меньший сегмент массива} {используется рекурсивный вызов функции} if j<=Mid then begin QuickSort (Mas,LowIndex,j); QuickSort (Mas,i,HiIndex); end else begin QuickSort(Mas,i,HiIndex);
QuickSort(Mas,LowIndex,j); end; end; end;
Добрый день, lonfst! А почему вы решили, что сортировка Шелла быстрее? На определенных входных данных вероятно она будет быстрее, но в общем и целом, я считаю, что Quicksort быстрее иначе стали бы люди использовать ее, как стандарт языка C/С++ и других популярных библиотек. Ответ отправлен: 03.09.2003, 09:13 Отправитель: vitya Отвечает Delphist
Здравствуйте, lonfst! Все нормально. Быстрая сортировка она на то и быстрая, что при удачном выборе среднего элемента выполняеся быстрее всех. Кроме того в сортировке Шелла у тебя неудачно подобрано d, ибо в конце он приходит к степеням двойки 64, 32, 16 ... А это один из самых неоптимальных вариантов. Кроме того у мебя пожалуй слишком много получается проходов по массиву. Попробуй что-нибудь типа 7,5,3,2,1, хотя может понадобится и больше проходов. Ответ отправлен: 02.09.2003, 18:10 Отправитель: Delphist
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.