Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на C++ Builder / Delphi

Выпуск № 211
от 05.09.2003, 20:00

Администратор:
Имя: Калашников О.А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 894
Отправлено ответов: 1647
Активность: 184.2 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Артём Шегеда
Статус: Профессиональный
Общий рейтинг: 116.8
URL: Пристанище неодинокого программиста
[Подробней >>]
Delphist
Статус: Начальный
Общий рейтинг: 102.89
[Подробней >>]
URiS
Статус: Профессиональный
Общий рейтинг: 129.74
URL: Бесплатный любительский софт, игры
[Подробней >>]
 
_vt
Статус: Профессиональный
Общий рейтинг: 121.87
[Подробней >>]
ART_43
Статус: Доверительный
Общий рейтинг: 121.81
[Подробней >>]
Cybernetic Creature
Статус: Опытный
Общий рейтинг: 118.36
[Подробней >>]
 
Marouder
Статус: Профессиональный
Общий рейтинг: 119.66
URL: Первый Хабаровский Форум
Телефон: (4212) 21-93-65
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 108.04
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 885. Здравствуйте, уважаемые эксперты !!! 1) Вот в Инете выискал процедуру для смены цвета курсора у сетк... (ответов: 7)
Вопрос № 886. Ув. эксперты Есть алгоритм сортировки Шелла {===== Пpогpаммный пpимеp =====} { Соpтиpовка Шелла } Pr... (ответов: 2)

Вопросов: 2, ответов: 9


 Вопрос № 885

Здравствуйте, уважаемые эксперты !!!
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.



Вопрос отправлен: 02.09.2003, 15:40
Отправитель: SATAN aka NAPALM

[Следующий вопрос >>] [Список вопросов]

Отвечает Артём Шегеда

Здравствуйте, 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);

Oxota 2 (Скачать! 803Кб)


Ответ отправлен: 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;



Вопрос отправлен: 02.09.2003, 17:41
Отправитель: lonfst

[Следующий вопрос >>] [Список вопросов]

Отвечает vitya

Добрый день, 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.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (38)
C / C++ (30)
Perl (5)
Builder / Delphi (18)
Pascal (22)
Basic / VBA (7)
Java / JavaScript (9)
PHP (10)
Криптография (9)
WinAPI (15)
Пользователю
Windows 95/98/Me (49)
Windows NT/2000/XP (67)
"Железо" (45)
Поиск информации (24)
Администратору
Windows NT/2000/XP (33)
Linux / Unix (10)
Юристу
Гражданское право (10)
Семейное право (6)
Трудовое право (6)
КоАП (5)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2003 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное