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

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


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

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

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

Выпуск № 109
от 28.04.2005, 01:40

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


Вопрос № 20087: Подключаю отчет Crystal Report из Delphi. В тело отчета вставляю ole объект. При запуске отчета из среды Crystal все работает. При вызове отчета из Delphi программы эти ole объекты не раскрываются при клике на них мышкой, показаны только значки. В че...
Вопрос № 20098: Переменная типа TString содержит данные (Например:Borland Delphi). Как в RichEdit1 вывести данные до первого пробела (в данном случее это будет Borland), а в RichEdit2 все остальное бузобразие (Delphi). RichEdit1.Lines.Add(?????????); ...
Вопрос № 20100: Благодаря Вашей помощи, создал программно новую вкладку в PageControl с указанным именем. А как проверить, может вкладка с таким именем уже существует? if ?????????????? (вкладка с именем (X) уже есть) then exit; ..
Вопрос № 20127: Создал программно парочку новых компонентов TEdit. Как теперь сделать для всех их одну процедуру OnKeyPress ? Пояснение: Пишу IRC клиент. Для каждого канала, на который зайдет пользователь программно создается новая вкладка в PageControl,...

Вопрос № 20087
Подключаю отчет Crystal Report из Delphi. В тело отчета вставляю ole объект. При запуске отчета из среды Crystal все работает. При вызове отчета из Delphi программы эти ole объекты не раскрываются при клике на них мышкой, показаны только значки. В чем проблема?
Отправлен: 22.04.2005, 05:11
Вопрос задала: npr2@pochta (статус: Посетитель)
Всего ответов отправлено: 1

Отвечает: sir henry
Здравствуйте, npr2@pochta!
1. Есть ли у Вас в строке USES ссылка на COMOBJ?
2. Прочитайте внимательно хелп к Crystal, может быть Вам нужно установить какие-то ActiveX компоненты для работы в автономном режиме?
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 22.04.2005, 11:52


Вопрос № 20098
Переменная типа TString содержит данные (Например:Borland Delphi).
Как в RichEdit1 вывести данные до первого пробела (в данном случее это будет Borland),
а в RichEdit2 все остальное бузобразие (Delphi).
RichEdit1.Lines.Add(?????????);
RichEdit2.Lines.Add(?????????);
Отправлен: 22.04.2005, 12:06
Вопрос задал: source (статус: Посетитель)
Всего ответов отправлено: 9

Отвечает: ImDeath
Мое почтение, source!
нет такого типа переменной как TString, есть String.
по существу: copy, pos, delete, insert, F1
Ответ отправил: ImDeath (статус: 2-ой класс)
Отправлен: 22.04.2005, 12:45
Оценка за ответ: 4
Комментарий оценки:
Извиняюсь за ламерский вопрос, но не могли бы Вы объяснить подробнее, как это применить на моем примере, а то я с Delphi пока еще на Вы и шепотом.

Отвечает: John Freeman
Здравствуйте, source!
Как обычно, сравнивая s[c] - char с ' ' в цикле for n:=1 to length(string) do
Ответ отправил: John Freeman (статус: Профессор)
Отправлен: 22.04.2005, 14:29

Отвечает: Stamm
Здравствуйте, source!
var i:integer;
s:string;
begin
s:='Borland Delphi'
i:=0;
while s[i]<>' ' do inc(i);
RichEdit1.lines.add(copy(s,1,i));
RichEdit2.lines.add(copy(s,i,Length(s)));
end;
Ответ отправил: Stamm (статус: 1-ый класс)
Отправлен: 22.04.2005, 14:47
Оценка за ответ: 5
Комментарий оценки:
Спасибо большое.......
тут еще один вопрос возник :)
а если нужно считать данные после 2-го или N -ного пробела?
Напишите пожалуйста, как надо изменить код.
var i:integer;
s:string;
begin
s:='Borland Delphi'
i:=0;
while s[i]<>' ' do inc(i);
RichEdit1.lines.add(copy(s,1,i));
RichEdit2.lines.add(copy(s,i,Length(s)));
end;

Отвечает: corsar
Здравствуйте, source!
TString - это string?
Тогда так:
var
s : string;
i : integer;
begin
s:='Borland Delphi';
i:=Pos(' ',s); //i=8
RichEdit1.Lines.Add(Copy(s,1,i-1)); //Bordland
RichEdit2.Lines.Add(Copy(s,i+1,Length(s)-i)); //Delphi
end;
Ответ отправил: corsar (статус: 2-ой класс)
Отправлен: 22.04.2005, 16:50

Отвечает: Master135
Здравствуйте, source!
k:integer;
ST:TString; массив строк
ST[0]:='Borland Delphi';
k:=Pos(' ',ST[0]);
RichEdit1.Lines.add(Copy(ST[0],1,k));
RichEdit2.Lines.Add(Copy(ST[0],k+1,Length(ST[0])));
Ответ отправил: Master135 (статус: 3-ий класс)
Отправлен: 23.04.2005, 02:27

Отвечает: sir henry
Здравствуйте, source!
Используйте функцию Copy(), которая берет указаную Вами часть строки.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 23.04.2005, 09:49

Отвечает: Полховский Александр Владимирович
Здравствуйте, source!
Функцией POS найти положение пробела, функциями ansirightstr и ansileftstr получить обе части.
Ответ отправил: Полховский Александр Владимирович (статус: Студент)
Отправлен: 23.04.2005, 22:24

Отвечает: mvp
Здравствуйте, source!
//-----
var s : TStrings;
//-----------
s := TStringList.Create;
s.delimeter := ' ';
s.delimetedtext := 'Borland Delphi';
RichEdit1.lines.add(s[0]);
RichEdit2.lines.add(s[1]);
//-------------
Пояснения: TStrings - абстрактный класс, описывающий принципы работы с массивом строк. Если писать s := TStings.Create, а потом попытаться выполнить какойто метод класса - получим "abstract error". А TStringList - наследуется от TStrings, поэтому и такая запись
Ответ отправил: mvp (статус: 2-ой класс)
Отправлен: 24.04.2005, 15:34

Отвечает: komatoz
st1:='';
st2:='';
for i:=1 to length(st) do
begin
if st[i]=' ' then
begin
st1:=copy(st,1,i);
st2:=copy(st,i,length(st-1);
break;
end;
end;
RichEdit1.Lines.Add(st1);
RichEdit2.Lines.Add(st2);
Ответ отправил: komatoz (статус: 1-ый класс)
Отправлен: 25.04.2005, 01:55


Вопрос № 20100
Благодаря Вашей помощи, создал программно новую вкладку в PageControl с указанным именем.
А как проверить, может вкладка с таким именем уже существует?
if ?????????????? (вкладка с именем (X) уже есть) then exit;
Отправлен: 22.04.2005, 12:59
Вопрос задал: source (статус: Посетитель)
Всего ответов отправлено: 3

Отвечает: Rusland
Здравствуйте, source!
for i:=1 to Form1.ComponentCount do
begin
if Form1.Components[i].Name = VkladkaName then
begin
//значит компонент с таким именем уже имеется
end
end;
Ответ отправил: Rusland (статус: 2-ой класс)
Отправлен: 22.04.2005, 15:27
Оценка за ответ: 5

Отвечает: corsar
Здравствуйте, source!
for i:=0 to PageControl1.PageCount-1 do
if PageControl1.Pages[i].Caption='X' then
Exit;
Ответ отправил: corsar (статус: 2-ой класс)
Отправлен: 22.04.2005, 16:49

Отвечает: Trer
Здравствуйте, source!
Универсальный способ поиска компонента по известному имени (которое содержится в переменной):

Приложение:

Ответ отправила: Trer (статус: 1-ый класс)
Отправлен: 22.04.2005, 19:28


Вопрос № 20127
Создал программно парочку новых компонентов TEdit.
Как теперь сделать для всех их одну процедуру OnKeyPress ?
Пояснение:
Пишу IRC клиент. Для каждого канала, на который зайдет пользователь программно создается новая вкладка в PageControl, на которой находятся разные компоненты, включая TEdit. Он будет предназначен для отправки сообщений в канал. Его имя (name) равно имени вкладки+'_Edit'. Имя вкладки соответствует названию IRC канала (без #).
Меня интересует только как написать процедуру OnKeyPress, чтобы она срабатывала для всех компонентов TEdit.
Если не трудно, то дайте плиз пример исходного кода написания процедуры, а то я раньше с таким извращением никогда не сталкивался.
Отправлен: 23.04.2005, 01:08
Вопрос задал: source (статус: Посетитель)
Всего ответов отправлено: 7

Отвечает: Васильев Павел
Здравствуйте, source!
// Процедура обрабочтчик
procedure MyEditClick(Sender: TObject);
begin
// Do something here
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
Edit1.OnClick := MyEditClick;
end;
Ответ отправил: Васильев Павел (статус: 1-ый класс)
Отправлен: 23.04.2005, 01:39
Оценка за ответ: 4
Комментарий оценки:
спасибо большое.
я так и поступил, только название процедуры присвоил при создании новой вкладки для канала, а саму процедуру вынес отдельно.
Сразу у меня все это не заработало из-за моей опложности - русская бука влезла в имя вкладки.

Отвечает: John Freeman
Здравствуйте, source!
Это бред, ничего писать не надо - пишешь для одного и в Object Inspector'e->Events просто выбираешь для OnKeyPress из списка для каждого Edit'a одну и ту же процедуру.
Ответ отправил: John Freeman (статус: Профессор)
Отправлен: 23.04.2005, 02:06
Оценка за ответ: 3
Комментарий оценки:
этих эдитов при запуске программы не существует. Они потом моздаются программно.
я уже сам выкрутился

Отвечает: wils0n
Здравствуйте, source!
Если я правильно понял, то след. образом:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure EditKey(Sender:TObject; var Key: Char); // это наш обработчик
public
{ Public declarations }
end;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
// я не стал создавать TEdit программно, Вы и сами знаете как это делать
Edit1.OnKeyPress:=EditKey; // Здесь происходит присваивание обработчиков.
Edit2.OnKeyPress:=EditKey; // Заметьте он один и тот же
end;
procedure TForm1.EditKey(Sender: TObject; var Key: Char);
begin
ShowMessage('Ура!'); // сам обработчик
end;
end.
Ответ отправил: wils0n (статус: 1-ый класс)
Отправлен: 23.04.2005, 11:40

Отвечает: corsar
Здравствуйте, source!
procedure TForm1.EditKeyPress(Sender : TObject;var Key : Char); //Обработчик события
var E : TEdit;T : TTabSheet;Channel : string;
begin
E:=TEdit(Sender);//E - edit-источник события
T:=TTabSheet(E.Parent);//T - закладка, на которой установлен edit (T - parent edit'а)
Channel:='#'+T.Name;//имя канала
......
end;
....
E1,E2 : TEdit; //Какие-то TEdit'ы;
.....
E1.OnKeyPress:=EditKeyPress; //Присваиваем edit'у обработчик
E2.OnKeyPress:=EditKeyPress; //Присваиваем edit'у обработчик
.....
Ответ отправил: corsar (статус: 2-ой класс)
Отправлен: 23.04.2005, 12:34

Отвечает: ImDeath
Мое почтение, source!
В design time:
пишешь событие OnKeyPress для Edit1, затем переключаешься на Edit2, в Object Inspector, на закладке Events, в выпадающем меню события OnKeyPress выбираешь обработчик события первого Edit-а.
Если надо в run time, то:
в design time создаешь обработчик события, это может быть уже созданный обработчик компонента Edit1 или написанный тобой специально, к примеру EditsKeyPress:
procedure TForm1.EditsKeyPress(Sender: TObject; var Key: Char);
begin
Memo1.Lines.Add(Key);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.OnKeyPress := EditsKeyPress;
Edit2.OnKeyPress := EditsKeyPress;
end;
Ответ отправил: ImDeath (статус: 2-ой класс)
Отправлен: 23.04.2005, 20:00

Отвечает: And1
Здравствуйте, source!
В Вашу процедуру OnKeyPress вствьте следующий код (см приложение)

Приложение:

Ответ отправил: And1 (статус: 1-ый класс)
Отправлен: 25.04.2005, 12:28

Отвечает: Delphin
Здравствуйте, source!
При создании компонента. В Run-Tim?
Назначь edit1.OnKeyPress := Имя функции для компонента TEdit;
В тело функции добавь проверку например (См. Приллжение)

Приложение:

Ответ отправил: Delphin (статус: 2-ой класс)
Отправлен: 25.04.2005, 19:36


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

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

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

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

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


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


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


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Отписаться

В избранное