Вопрос № 19677: Уважаемые господа эксперты! Прошу меня простить за, может быть наивный вопро, но...
1. Арифметическое выражение, которое позволяет получить из любого целого числа только цифры 0, 1, 2.
2. Выражение для получения пяти цифр из любого целого чис...Вопрос № 19680: как поместить в компонент ComboBox список шрифтов установленных в системе и чтоб они отображались каждый своим начертанием???...Вопрос № 19691: Мне надо из текстового файла считать строку в переменную с которой я потом работаю, размер строки 4000-5000 знаков(варьируется), пробовал код который находится в приложении выдает ошибку "invalid property
value". Как мне правильно считать с...Вопрос № 19695: Здравствуйте уважаемые эксперты!
Перехожу сразу к вопросам:
1) Как при запуске программы срзау минимизировать её в трей? Использую компонент CoolTrayIcon. Пишу такой код: Application.Minimize; CoolTrayIcon1.HideMainForm; Но он только создаёт ...Вопрос № 19710: Как обратится к свойствам компонентам, зная только его имя. То есть во время выполнения программы я узнаю имя компонента, который мне необходим. Нужно в этом компоненте изменить, например, caption....Вопрос № 19712: Как через
Socket передать картинку от сервера к клиенту и сохранить ее на стороне клиента прямо в image1, сам Socket уже настроен, пришлите код на стороне сервера и клиента....Вопрос № 19715: Доброе время суток!
Возникли вопросы по написанию чата для локальной сети.
1. Я создаю (TCoolItemImage это компоненты сторонние), но смысл тотже итем ввиде рисунка (Смайлик) вот я загрузил назначил все свойства и т.п. Это ладно но как мне по...
Вопрос № 19677
Уважаемые господа эксперты! Прошу меня простить за, может быть наивный вопро, но...
1. Арифметическое выражение, которое позволяет получить из любого целого числа только цифры 0, 1, 2.
2. Выражение для получения пяти цифр из любого целого числа i - 0, 1, 2, 3, 4.
3. Стандартная функция языка Objeck Pascal, позволяющее получить из любого целого числа X случайное число.
Заранее признателен voinvvs.
Отправлен: 14.04.2005, 06:34
Вопрос задал: voinvvs (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: sir henry
Здравствуйте, voinvvs!
1. А в арифметике Вы такое арифметическое выражение встречали? :)
Преобразуйте число в строку, а потом с помощью функции POS(), ищите нужные Вам символы.
var
i, n, j: integer;
s, s1: string;
Begin
i:=723; {Целое число}
s:=IntToStr(i); {Преобразуем его в строку}
n:=Pos('2', s); {Получаем позицию символа "2" в этой строке}
s1:=Copy(s, n, 1); {получаем "2" из строки}
{Далее, в зависимости от Ваших нужд, символ можно преобразовать опять в число}
j:=StrToInt(s1);
End.
2. См. пункт 1.
3. Нет такой функции, но можно сгенерировать случайное число в пределах от 0 до заданного Вами:
Randomize; {Включается генератор случайных чисел}
Random(Предел); {Генерация случаиного число от 0 до числа ПРЕДЕЛ}
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 14.04.2005, 07:17
Отвечает: Malish
Здравствуйте, voinvvs!
Я понял вопрос так : есть число, любое целое, и из него надо получить 0, 1, 2 и 0, 1, 2, 3, 4! ТАК?
Тогда так сделай: Х mod 3, Х mod 5. Любое число приводится к тем что надо.
И на 3 - random(Х), но вот только они псевдо случайные(после загрузки программы повторяются). А что бы не повторялись перед "end." запиши такое initialization randomize;
Ответ отправил: Malish (статус: 10-ый класс)
Отправлен: 14.04.2005, 11:48
Вопрос № 19680
как поместить в компонент ComboBox список шрифтов установленных в системе и чтоб они отображались каждый своим начертанием???
Отправлен: 14.04.2005, 08:07
Вопрос задал: egik (статус: Посетитель)
Всего ответов отправлено: 3
Отвечает: sir henry
Здравствуйте, egik!
Занести список шрифтов не трудно:
ComboBox1.Items:=Screen.Fonts;
А вот как пункты сделать разными шрифтами - не знаю. Наверное через метод OnDrawItem, который отвечает за перерисовку пункта.
Что-то типа такого:
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
With (Control as TListBox).Canvas do
Font.Name:={Здесь нужно выбрать шрифт из списка шрифтов}
end;
А вот что и каким образом там присваивать - поэкспериментируйте сами. :)
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 14.04.2005, 09:38
Отвечает: Pushkin
Здравствуйте, egik!
Дополню ответ sir henry
1. обработчик события OnShow формы Form1:
procedure TForm1.FormShow(Sender: TObject);
begin
ComboBox1.Items := Screen.Fonts;
end;
2. в обработчике события OnDrawItem твоего ComboBox1:
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
(Control as TComboBox).Canvas.FillRect(Rect);
(Control as TComboBox).Canvas.Font.Name := ComboBox1.Items.Strings[Index];
(Control as TComboBox).Canvas.TextOut(Rect.left,Rect.top,ComboBox1.Items.Strings[Index]);
end;
Каждая строчка здесь нужна. Попробуй убрать что-нибудь и посмотри что получится
3. Убедиться, что ComboBox1.Style равно
csOwnerDrawFixed или csOwnerDrawVariable
Ответ отправил: Pushkin (статус: 1-ый класс)
Отправлен: 14.04.2005, 12:22
Отвечает: Voituk Alexander
Здравствуйте, egik!
В предыдущем ответе все правильно - как получить список шрифтов.
ComboBox1.Items:=Screen.Fonts;
А что-бы отрисовать нужно:
1. Установить стиль ComboBox.Style := csOwnerDrawVariable; (это можно сделать в Object Inspector)
2. Написать два события
2.1. OnMeasureItem - здесь ты возвращаешь высоту в пикселях рисовавшегося пункта ComboBox.
ComboBox1.Canvas.Font.Name := ComboBox1.Items[Index];
Height := ComboBox1.Canvas.TextHeight('ТЕСТОВАЯ СТРОКА');
И Index и Height передаются в процедуру.
2.2. OnDrawItem - здесь ты собственно рисуешь
ComboBox1.Canvas.Font.Name := ComboBox1.Items[Index];
if State Is odSelected then
ComboBox1.Canvas.Brush.Color := clBlue //пункт выделен
else
ComboBox1.Canvas.Brush.Color := clWhite; //пункт не выделен
ComboBox1.Canvas.TextRect(Rect,Rect.Left,Rect.Top,'ТЕСТОВАЯ СТРОКА');
Index,State и Rect передаются в процедуру.
Прошу извинить за возможные ошибки. Я пишу в основном на С++. На паскале редко.
Ответ отправил: Voituk Alexander (статус: 7-ой класс)
Отправлен: 14.04.2005, 12:42
Вопрос № 19691
Мне надо из текстового файла считать строку в переменную с которой я потом работаю, размер строки 4000-5000 знаков(варьируется), пробовал код который находится в приложении выдает ошибку "invalid property value". Как мне правильно считать строку(может есть другие способы)? Я думаю правильным будет считать строку в WideString т.к. в всего String 255 знаков.
Приложение:
Отправлен: 14.04.2005, 12:10
Вопрос задал: Stereo (статус: Посетитель)
Всего ответов отправлено: 6
Отвечает: Pushkin
Здравствуйте, Stereo!
Используем процедуры, которые присутствовали еще в Turbo Pascal 1.0
Это конечно не совсем по виндозному, но работает:
procedure TForm1.Button1Click(Sender: TObject);
var
mf: SYSTEM.Text;
s: String;
begin
SYSTEM.Assign(mf,'q.txt');
SYSTEM.Reset(mf);
SYSTEM.ReadLn(mf,s);
Button1.Caption := IntToStr(Length(s));
Memo1.Lines.Add(s);
SYSTEM.Close(mf);
end;
Ответ отправил: Pushkin (статус: 1-ый класс)
Отправлен: 14.04.2005, 12:39 Оценка за ответ: 4 Комментарий оценки: Действительно все работает.. но хотелось найти ошибку в моем примере. Я знаю паскаль.. но мне думалось что такую большую строку не прочитает...
Отвечает: Кудрявцев Андрей
Здравствуйте, Stereo!
Можно попробовать использовать и достаточно виндозные AssignFile, Reset, ReadLn, CloseFile. Они без проблем работают с длинными строками, главное - чтобы не было в середине символа #0 - этого не любит ни одна строка в Дельфи.
На худой конец, можно использовать нетипизированные файлы и после присваивать прочтенный результат типу PChar - сработает стопроцентно
Приложение:
Ответ отправил: Кудрявцев Андрей (статус: 1-ый класс)
Отправлен: 14.04.2005, 13:02
Отвечает: Bochvarov NikB
Здравствуйте, Stereo!
А прочитал ли тьи о LoadFromFile(const FileName: string); ?
Memo1.Lines.LoadFromFile('Name');
Так читаются все строки, но можно сделат свой TStrings, прочитат вес файл и "свою" строку вставит в Memo.
Будет на много бьистрее (в общем случее).
Ответ отправил: Bochvarov NikB (статус: 2-ой класс)
Отправлен: 14.04.2005, 13:29
Отвечает: Boriss
Здравствуйте, Stereo!
Если это действительно текстовый файл, то, по идее, должно пройти
Memo1.Lines.LoadFromFile();
Ведь lines - то в конечном итоге String, коя есть AnsiString размером до 2Г.
или использовать поток как в приложении
Проблема, возможно, в другом: Tmemo -фильтрует данные
Что-то не найду у себя файла с такими длинными строками, так что проверить не могу
Приложение:
Ответ отправил: Boriss (статус: Профессор)
Отправлен: 14.04.2005, 13:48 Оценка за ответ: 3 Комментарий оценки: Я же написал что надо в переменную считать... memo1 мне для наглядности, лучше скажите почему ошибку пишет "invalid property value"
Отвечает: ImDeath
Мое почтение, Stereo!
С каких пор в string стало влезать только 255 "знаков" мне не совсем понятно...
Если тебе надо загрузить текст в Memo, то как правильно выше написавшие отметили: Memo1.Lines.LoadFromFile();
Если же надо грузить действительно в переменную, то смотри приложение.
Кстати сказать FileStream работает побыстрее AssignFile/Reset/ReadLn/CloseFile, так что его использование вполне оправдано - это для выше писавших.
Ну и совет напоследок: освобождая память объекта, вызывай не Destroy, а Free.
Приложение:
Ответ отправил: ImDeath (статус: 1-ый класс)
Отправлен: 15.04.2005, 01:44 Оценка за ответ: 4 Комментарий оценки: Ненадо так ругатся я ведь по тому спрашиваю, что незнаю :) Просто в паскале было 255.
Отвечает: sir henry
Здравствуйте, Stereo!
1. Вообщето в Дельфи по умолчанию string - это динамическая строка (AnsiString), размер которой не лимитируется, точнее лимитируется двумя гигами. Может быть у Вас в опциях компилятора задано другое? Тогда задайте тип строки напрямую:
s: AnsiString;
Можно использовать тип PChar - это тоже динамическая строка, каким размером она ограничивается не помню, но очень большая. Ее завершение - //0, т.е. по типу она отличается от AnsiString.
2. Почему Вы не используете для чтения из потока методы:
TFileStream.Read(var Buffer, Count: LongInt);
или
TFileStream.ReadBuffer(var Buffer, Count: LongInt);
???
Первый параметр - это буфер (тот же PChar, например), а второй - количество байт которое нужно считать из потока.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 15.04.2005, 06:23 Оценка за ответ: 5 Комментарий оценки: С этим вроде разобрался помогите со след вопросом, как файл передать через Socket
Вопрос № 19695
Здравствуйте уважаемые эксперты!
Перехожу сразу к вопросам:
1) Как при запуске программы срзау минимизировать её в трей? Использую компонент CoolTrayIcon. Пишу такой код: Application.Minimize; CoolTrayIcon1.HideMainForm; Но он только создаёт иконку в трее, а сама форма не минимизируется. В чём проблема, может есть какой-нибудь другой метод??
2) На форме есть компонент LabledEdit. Когда я ставлю свойство ReadOnly - True, то изменять содержимое LabledEdit'a нельзя, а курсор редактирования остаётся. Как убрать этот курсор?
Заранее благодарен за присланные ответы!
Отправлен: 14.04.2005, 13:11
Вопрос задал: Подковырин Андрей Вадимович (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: CJ
Здравствуйте, Подковырин Андрей Вадимович!
1) Попробуй после кода сворачивания в трей писать что-то типа Forma1.Visible:=false; А что-бы форму показать form1.visible:=true;
2) С обработчике окмпонента (MouseMove), движения мыши напиши код смены курсора.
LabelEdit.cursor:=crHelp, тогда всегда будет знак вопроса, если вместо crHelp напишешь другой курсор, то он будет всегда.
Ответ отправил: CJ (статус: Студент)
Отправлен: 14.04.2005, 15:43
Отвечает: John Freeman
Здравствуйте, Подковырин Андрей Вадимович!
1) Для 2k будет выгляеть как Form1.Hide, сама иконка не при чём
2) Enabled:=False;
Ответ отправил: John Freeman (статус: Профессионал)
Отправлен: 14.04.2005, 15:59
Вопрос № 19710
Как обратится к свойствам компонентам, зная только его имя. То есть во время выполнения программы я узнаю имя компонента, который мне необходим. Нужно в этом компоненте изменить, например, caption.
Отправлен: 14.04.2005, 15:38
Вопрос задал: Rusland (статус: 1-ый класс)
Всего ответов отправлено: 3
Отвечает: John Freeman
Здравствуйте, Rusland!
Form1.FindComponent По имени, но только для компонентов с Owner form1
Ответ отправил: John Freeman (статус: Профессионал)
Отправлен: 14.04.2005, 16:03 Оценка за ответ: 5 Комментарий оценки: Спасибо. То что нужно.
Отвечает: Voituk Alexander
Здравствуйте, Rusland!
Смотря что ты имеешь в виду Имя компонента (это свойство Name) или Имя типа компонента.
Если просто имя компонента, то просто
for i:=1 to Form1.ComponentCount do
begin
if Form1.Components[i].Name = FoundName then
begin
берем этот компонент (components[i]), приводим его к нужному виду
и меняем его свойства
end
end;
Ответ отправил: Voituk Alexander (статус: 7-ой класс)
Отправлен: 14.04.2005, 16:11 Оценка за ответ: 4 Комментарий оценки: Спасибо
Отвечает: Полищук Владислав Игоревич
Здравствуйте, Rusland!
Все компоненты формы собраны в массив Components.
В нем можно найти компоненту с нужным именем т работать сней.
С уважением, Владислав
Ответ отправил: Полищук Владислав Игоревич (статус: 1-ый класс)
Отправлен: 14.04.2005, 16:25 Оценка за ответ: 4
Вопрос № 19712
Как через Socket передать картинку от сервера к клиенту и сохранить ее на стороне клиента прямо в image1, сам Socket уже настроен, пришлите код на стороне сервера и клиента.
Отправлен: 14.04.2005, 16:17
Вопрос задал: Stereo (статус: Посетитель)
Всего ответов отправлено: 1
Отвечает: sir henry
Здравствуйте, Stereo!
См. приложение. У меня в факах валялось.
Приложение:
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 15.04.2005, 10:15 Оценка за ответ: 3 Комментарий оценки: Я использую ClientSocket,ServerSocket :(
Вопрос № 19715
Доброе время суток!
Возникли вопросы по написанию чата для локальной сети.
1. Я создаю (TCoolItemImage это компоненты сторонние), но смысл тотже итем ввиде рисунка (Смайлик) вот я загрузил назначил все свойства и т.п. Это ладно но как мне по обрпботчику OnClick назначить обработку? И как определить какой рисунок был нажат? Я думаю по свойству tag. Мне лишь нужно чтоб вы сказали как устроить при создания компоненты уже в RunTime его обработчик OnClick и в зависимости от того что нажато вставить картинку (Как вставить я знаю).
2. Счем мне лучше работать в плане сети? С Indy или WinSock? Можете подкинуть информацию по WinSock? Желательно в html формате т.к. у нас интернет дорогой чтоб пометрово качать. И премного буду благодарен если дадите простенький пример.
3. Как работать с потоками? Как сделать чтоб WinSock при принятии данных что-то делал. Как реализовать это в потоке?
Приложение:
Отправлен: 14.04.2005, 17:00
Вопрос задал: Delphin (статус: 2-ой класс)
Всего ответов отправлено: 1
Отвечает: X
Здравствуйте, Delphin!
1)Причём тут Tag-это вспомогательное свойство, которое ни на что не влияет и ни чем(кроме програмиста) не устанавливается.Нажатый рисунок можно вычислить по координатам мыши(mouse.CursorPos или в onMouseDown).Может можно как-то попроще но я не знаю что такое TCoolItemImage.
2,3)Ну в принцепе как хочеш но я бы использовал WinSock.
Про компоненты TClientSocket и TServerSocket можешь найти на progs.biz в уроках по Delphi - там две небольшие статьи.
Ответ отправил: X (статус: 1-ый класс)
Отправлен: 14.04.2005, 22:04 Оценка за ответ: 3 Комментарий оценки: Рї3 спасибо. Рђ РІРѕС‚ РїСЂРё помощи Tag СЏ РІСЃРµ Рё решил :)