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

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


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

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 132
от 25.05.2005, 12:20

Администратор:Калашников О.А.
В номере:Вопросов: 3, Ответов: 8


Вопрос № 21077: Всем привет. При выводе текста кроме букв закрашивается прямоугольник по размеру текста. Можно ли добиться вывода текста без прорисовки прямоугольника? Заранее благодарен....
Вопрос № 21080: Здравствуйте Ballon! Уточняю свой вопрос № 20998. По условию задачи необходимо вычислить положения кнопки, чтобы каждое новое ее положение было отделено от предыдущего. При ширине кнопки в 100 пикселей в заданных размерах формы по ширине мож...
Вопрос № 21085: Есть 5 одинаковых потока в массиве потоков: TReadThread = class(TThread) private protected procedure Execute; override; end; ....... var ....... ar: array[1..5] of TReadThread; procedure TReadThread.Exec...

Вопрос № 21077
Всем привет. При выводе текста кроме букв закрашивается прямоугольник по размеру текста. Можно ли добиться вывода текста без прорисовки прямоугольника?
Заранее благодарен.

Приложение:

Отправлен: 19.05.2005, 18:13
Вопрос задал: Березуев Роман Иванович (статус: Посетитель)
Всего ответов отправлено: 3

Отвечает: X
Здравствуйте, Березуев Роман Иванович!
Я не понял где это используется.
Если Canvas.textout(100,100,'abcdefg') например у формы, то никакого прямоугольника нет, ну а если у Image, то можно разве-что поменять его(прямоугольника) цвет: Image1.Canvas.Brush.Color:=$ff0000;
Ответ отправил: X (статус: 4-ый класс)
Отправлен: 19.05.2005, 18:47
Оценка за ответ: 4
Комментарий оценки:
Не совсем. На форме прямоугольника не видно в силу одинаковости цвета фона и прямоугольника. Если бы фон был заполнен тонким рисунком, то однотонный прямоугольник сразу стал бы заметен. Попробуйте:
procedure TForm1.Button1Click(Sender: TObject);
begin with Canvas do begin
Brush.Color:=clWhite;
FillRect(Canvas.ClipRect);
Pen.Color:=clBlack;
Brush.Color:=clYellow;
Font.Color:=clRed;
TextOut(100,100,'abcdef');
end;end;
У меня как раз проблема в потере фонового рисунка под надписями. Вот где http://www.berezuev.hotbox.ru/SCAD/Program2.gif
В PASCAL такого нет.

Отвечает: sir henry
Здравствуйте, Березуев Роман Иванович!
Попробуйте с помощью функции SetBkColor(), поставить цвет фона такой-же, какой у Вас в момент рисования текста. Еще, чтобы прямоугольник текста не закрашивал фоновую картинку, необходимо с помощью функции SetBkMode(TRANSPARENT) установить режим прозрачности.
После всего этого можно смело рисовать текст. :)
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 20.05.2005, 04:37
Оценка за ответ: 5
Комментарий оценки:
Да спасибо уже разобрался, кстати работает и
Brush.Style:=bsClear;
Но только сразу перед
textout(100,100,'abcdefg');

Отвечает: Jadd
Здравствуйте, Березуев Роман Иванович!
Нужно пользоваться функциями WinAPI. У винды достаточно обширная библиотека для работы с фонтами и вообще с графикой - GDI. По этому поводу есть много книг. Так вот. Есть такая функцайка SetBkMode, в которой нужно передать параметр TRANSPARENT. И все должно прекрасно работать.
Ответ отправил: Jadd (статус: 3-ий класс)
Отправлен: 20.05.2005, 09:06
Оценка за ответ: 5
Комментарий оценки:
Спасибо.


Вопрос № 21080
Здравствуйте Ballon!
Уточняю свой вопрос № 20998.
По условию задачи необходимо вычислить положения кнопки, чтобы каждое новое ее положение было отделено от предыдущего. При ширине кнопки в 100 пикселей в заданных размерах формы по ширине может разместиться 3 кнопки, по высоте окна можно задать 5
положений. Из вышеизложенного:
1. Написать формулы для вычисления случайных координат кнопки. При вычислении учесть,
что координаты задаются в пикселях и результатом вычисления выражения должно быть только целое число. Полученные значения присвоить соответствующим координатам кнопки:
Button1.____________: = _________________________;
Button2.____________: = _________________________;
2. Создать обработчик события от таймера:
procedure TForm1.Timer1Timer(Sender: TObject);
var __________ //целочисленные переменные для определения целых координат нового положения кнопки по горизонтали и вертикали
begin
______
______
______
end;
3. Создать обработчик события при попадании на прыгающую кнопку, если ее удалось поймать.
procedure Tform1.Button1Clic(Sender: Tobject);
begin
// пойманная кнопка остановится
_______
_______
//теперь нужно активировать кнопку выхода из программы
end;
Буду очень признателен за помощь. Хотелось бы и дальше работать с Вами, по всей видимости вопросов еще будет много.
P.S. Вашим ответом очень доволен, спасибо. У меня Delphi 6, а вот русский Help нигде найти не могу.
Ответу любого эксперта буду очень признателен.
Отправлен: 19.05.2005, 18:55
Вопрос задал: Петров Василий Владимирович (статус: Посетитель)
Всего ответов отправлено: 2

Отвечает: X
Здравствуйте, Петров Василий Владимирович!
Значит я понял так:ширина фирмы 300(устанавливаем её)
высота формы - 5 кнопок, раз не сказано какая высота кнопки, оставляем её по умолчанию - 25(ставим top у формы 125), далее ставим на форму Button1, Button2 и ButtonExit(у неё Visible-false), далее см. листинг Unit1. Если что не так, пишите.
Насчёт Help-а: советую купить какую-нибудь бумажную книгу.Я например в основном учился по книге Фаронова "Delphi. Програмирование на языке высокого уровня". Полностью переведённый на русские Help по Delphi существует врятли, хотя точно не знаю. В конце концо можно пользоаться переводчиком(что я нередко и делаю).

Приложение:

Ответ отправил: X (статус: 4-ый класс)
Отправлен: 19.05.2005, 21:41
Оценка за ответ: 4

Отвечает: Ballon
Здравствуйте, Петров Василий Владимирович!
На событие кнопки OnMouseMove меняй координаты кнопки значения Button1.Top и Button1.Left
Приведу ниже листинг. ТОЛЬКО ЕСЛИ ОНА ИМЕЕТ ФОКУС МОЖНО НАЖАТЬ ENTER И ПРОИЗОЙДЕТ СОБЫТИЕ OnClick. ПОЭТОМУ СОВЕТУЮ ИСПОЛЬЗОВАТЬ SpeedButton.
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
a,b: integer;
begin
Randomize;
a := Random(Form1.ClientHeight-Button1.Height);
b := Random(Form1.ClientWidth-Button1.Width);
Button1.top := a;
Button1.left := b;
end;
ДА И ПОЙМАТЬ ЕЁ ВАМ НЕ УДАСТСЯ.
А чтобы активизировать.
Если она невидима то Button1.Visible := true;
А если отключена то Button1.Enabled := true;
Ответ отправил: Ballon (статус: 2-ой класс)
Отправлен: 20.05.2005, 12:04
Оценка за ответ: 4
Комментарий оценки:
Хотелось бы более подробно на пункты № 1 и № 2.


Вопрос № 21085
Есть 5 одинаковых потока в массиве потоков:
TReadThread = class(TThread)
private
protected
procedure Execute; override;
end;
.......
var
.......
ar: array[1..5] of TReadThread;
procedure TReadThread.Execute;
var
i,k : integer;
begin
// поток выполняет длинные по времени действия, например такие:
k := 0;
for i:=1 to 99999 do
k := k+1;
end;

Приложение:

Отправлен: 19.05.2005, 22:22
Вопрос задал: andrey (статус: Посетитель)
Всего ответов отправлено: 3

Отвечает: Alex Diesel
Здравствуйте, andrey!<br>Возможно я что-то недопонял, но почему бы просто не создать массив, вызывается поток - устанавливает соответсвующий элемент массива в 1, выполнил все - обратно 0. Или, если знаешь ассемблер, то можно даже биты устанавливать в числе, ведь надо просто знать: поток работает или не работает...
Ответ отправил: Alex Diesel (статус: 4-ый класс)
Отправлен: 19.05.2005, 22:41

Отвечает: sir henry
Здравствуйте, andrey!
По-моему такого свойства у этого класса нет. Однако ничего не мешает Вам ввести свойство, что-то вроде TMyThread.InExecute: boolean; и в начале выполнения процедуры ставить ему True, а в конце - False. Таким образом Вы будете знать какой поток работает, а какой нет.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 20.05.2005, 04:49

Отвечает: Jadd
Здравствуйте, andrey!
Значит так. В винде есть множество мощных средств для управления потоками. Класс TThread дан как обертка для эффективного использования потоков. Эту обертку можно расширять как вздумается. Т.е. 1)Сделать защищенную переменную, которая содержит статус потока и возвращать через функцию ее статус. 2)Написать функцию, которая будет Resume и Suspend потока, а из функции execute в конце вызывать Self.Suspend для перевода в режим ожидания. Вообще, я давненько не писал трэдов на паскале (года 3-4), для меня ближе С++, но даже на паскале можно юзать объекты ядра средствами WinAPI. Однажды даже было желание на их основе написать свой класс для манипуляции потоками на паскале, уж больно много возможностей у WinAPI. Удачи.
Ответ отправил: Jadd (статус: 3-ий класс)
Отправлен: 20.05.2005, 09:25


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

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

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Отписаться
Вспомнить пароль

В избранное