IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

6 страниц V « < 3 4 5 6 >  
 Ответить  Открыть новую тему 
> Графический редактор в Delphi
сообщение
Сообщение #81


Пионер
**

Группа: Пользователи
Сообщений: 80
Пол: Мужской

Репутация: -  0  +


Пишу функцию, чтобы в поля нельзя было вводить недопустимые значения, решил по уму сделать, чтобы сразу всё обрабатывалось, но с синтаксисом проблемки:
function Tf_main.Vvod_dannih:boolean;
var
i,j:integer;
begin
for i := 0 to ComponentCount - 1 do
if Components[i] is TEdit then
with Components[i] as TEdit do
begin
for j := 0 to Length(Components[i].text) do//Здесь ошибочка с обращением к свойству text
if (Components[i].Text[j] not in['0'..'9', ',']) then //not in тоже не пашет, хотя вроде когда-то писал так
begin
ShowMessage('В поле введено неправильное значение');
Result:=false;
Break;
end else
Result:=true;
end;
end;

Как правильно можно обращаться к текстам всех Editов? Подскажите, пожалуйста.

Сообщение отредактировано: RussoTuristo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #82


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Нафига ты используешь with, если внутри него всё равно обращаешься через Components[i]?
Внимательнее пиши же!

function Tf_main.Vvod_dannih:boolean;
var
i,j:integer;
begin
for i := 0 to ComponentCount - 1 do
if Components[i] is TEdit then
with TEdit(Components[i]) do begin // можно без as, так как проверку ты уже сделал строчку назад
for j := 1 to Length(text) do// убрать нафиг Components[i]. и индексировать строки надо от 1
if not (Text[j] in['0'..'9', ',']) then //not in тоже не пашет, хотя вроде когда-то писал так
begin
ShowMessage('В поле введено неправильное значение');
Result:=false;
Break;
end else
Result:=true;
end;
end;



Сообщение отредактировано: TarasBer -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #83


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


function Tf_main.Vvod_dannih : boolean;
var
i, j: integer;
begin
Result := False;
for i := 0 to ComponentCount - 1 do
if Components[ i ] is TEdit then
with Components[ i ] as TEdit do
begin
for j := 0 to Length({(Components[ i ] as TEdit).}Text) do
if not ({(Components[ i ] as TEdit).}Text[j] {not} in['0'..'9', ',']) then
begin
ShowMessage('В поле введено неправильное значение'); Exit;
end;
end;
Result := True;
end;

Почему закомментировал? Потому что у тебя With работает, и просто Text эквивалентно (Components[i] as TEdit).Text. А not надо вынести в начало, он относится к результату выражения (text[j] in ['0'..'9', ',']). Кстати, пользовался бы ты не запятой, а переменной DecimalSeparator - было бы лучше...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #84


Пионер
**

Группа: Пользователи
Сообщений: 80
Пол: Мужской

Репутация: -  0  +


Спасибо, DecimalSeparator видел в интернете, но честно говоря не знал, что это значит.
А если использовать такой синтаксис, то установить фокус уже никак не получится в этот Edit, так как работа идет уже непосредственно с текстом?
IUnknown, С днём Рождения, кстати!

Сообщение отредактировано: RussoTuristo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #85


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


С чего бы? Ты хочешь оставить фокус в том Edit-е, который некорректно заполнен, что-ли? Вот так попробуй:

function Tf_main.Vvod_dannih : boolean;
var
i, j: integer;
Edit : TEdit;
begin
Result := False;
for i := 0 to ComponentCount - 1 do
if Components[i] is TEdit then
begin
Edit := Components[i] as TEdit;
for j := 1 to Length(Edit.Text) do
if not (Edit.Text[j] in['0'..'9', ',']) then
begin
Edit.SelStart := 1; Edit.SelLength := Length(Edit.Text);
Edit.SetFocus;
ShowMessage('В поле введено неправильное значение'); Exit;
end;
end;
Result := True;
end;
У тебя было 2 трудноуловимых ошибки, кстати... Посмотри внимательно, и поймешь, какие. И в чем опасность.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #86


Пионер
**

Группа: Пользователи
Сообщений: 80
Пол: Мужской

Репутация: -  0  +


Первая понял в чем - я не все Editы просматривал, нумерация-то с нуля идет, а вот вторая связана с длиной текста в Editе походу, но что-то сразу не доходит, в чем её серьёзность...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #87


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Не совсем. Первая - это то, что у тебя есть другое свойство Text в контексте этой процедуры. То есть, вставь строку:
   Result := False;
ShowMessage(Text); // <--- Вот эту, еще до того, как начинаешь проверять компоненты
for i := 0 to ComponentCount - 1 do
, и программа откомпилируется нормально. Какое из свойств будет взято после того, как отработает With - то, что доступно и без With, или то, что относится именно к Edit-ам - я в этом не могу быть уверен. Поэтому я от With избавился, и теперь обращение Edit.Text - это 100% обращение к содержимому компонента типа TEdit.

Вторая ошибка: индексация в строке начинается с 1, а не с 0. Читать ты, конечно, нулевой символ можешь (хотя я бы и это запретил, меньше ошибок будет, вот именно в этом случае ты бы тут же получил "по рукам", и понял бы, в чем дело. Почему этого не сделают никак - не понимаю), а вот попробовать записать в него что-то - уже не получится. Тут же получишь сообщение, что "0-ой символ недоступен, используйте Length/SetLength". Так что и проверять символы в строке надо с первого, а не с нулевого.

Сообщение отредактировано: IUnknown -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #88


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Я бы делал проверку на корректность содержимого не перебором символов, а через Val. Мне кажется, логичнее проверять, можно ли строку сделать числом, при помощи функции, делающей строку числом.

> а вот вторая связана с длиной текста в Editе походу, но что-то сразу не доходит, в чем её серьёзность...

А ты прочитай мой пост (82), который IUnknown перебил с ошибкой в индексации строки.

Сообщение отредактировано: TarasBer -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #89


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
мой пост (82), который IUnknown перебил с ошибкой в индексации строки.
Не льсти себе, я твой пост не перебивал. Я даже не видел его. Я поправил исходный текст из поста №81. Как выяснилось - не всё увидел. Говорю же, стал бы компилятор материться - обратил бы внимание на то, что там происходит. А так - оно осталось без внимания...

Еще один камень в огород Дельфостроителей (про автодеструкторы ты уже говорил)

Сообщение отредактировано: IUnknown -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #90


Пионер
**

Группа: Пользователи
Сообщений: 80
Пол: Мужской

Репутация: -  0  +


Добрый день! Подскажите, пожалуйста, а можно ли в текстовый файл вместе с таблицами и Эдитами вывести графики из TChart и рисунок? Есть такая необходимость, про THcart что-то нашел в интернете, попытался наваять, но вместо графиков выводятся названия TChartов, а изображение вообще вызывает сомнения -можно ли ехо сохранить в текстовый файл или только в bmp/jpeg?

procedure Tf_main.N7Click(Sender: TObject);
var
f : TextFile;
j, R: Integer;
BM: TBitmap;
begin
if SaveDialog1.Execute then
begin
AssignFile(f, SaveDialog1.FileName);
Rewrite(f);

for j := 0 to ComponentCount - 1 do
if Components[j] is TEdit then
with Components[j] as TEdit do
begin // Saving Edits
WriteLn(f, 'TEdit' + #13#10 + Name + #13#10 + Text);
end
else
if Components[j] is TStringGrid then
with Components[j] as TStringGrid do
begin // Saving Grigs
WriteLn(f, 'TGrid' + #13#10 + Name + #13#10 + IntToStr(RowCount));
for R := 0 to RowCount - 1 do
WriteLn(f, StringReplace(Rows[R].Text, #13#10, #9, [rfReplaceAll]));
end
else
if Components[j] is TChart then
with Components[j] as TChart do
begin // Saving Grigs
BM:=TBitmap.Create;
try
BM.PixelFormat:=pf24bit;
BM.Width:=Chart1.ClientWidth;
BM.Height:=Chart1.ClientHeight;
Chart1.PrintPartialCanvas(bm.canvas, Chart1.ClientRect);
BM.SaveToFile('f');
finally
BM.Free;
end;
end;
CloseFile(f);
end;
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #91


Гость






В тестовый? Нет. На то он и текстовый.
Можно в вордовый.
Можно сохранить картинку в файл, а потом сгенерировать html, в который включена эта картинка.

Только лучше не в bmp сохранять, а в png. Правда, как это делать - я не знаю, но вроде есть какое-то стандартное решение.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #92


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
а можно ли в текстовый файл вместе с таблицами и Эдитами вывести графики из TChart и рисунок?
Выше уже сказали, что в текстовый - нет. А просто графику - можно. Либо TChart.SaveToMetafile, либо TChart.SaveToMetafileEnh (про SaveToBitmapFile я не говорю, кому нужен BMP-файл?)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #93


Пионер
**

Группа: Пользователи
Сообщений: 80
Пол: Мужской

Репутация: -  0  +


А как сохранить Chart и Image в вордовский фал, может кто-нибудь подсказать? А-то что-то ничего в интернете нашарить не могу похожего...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #94


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


У приложения Word есть коллекция InlineShapes, к которой и надо добавлять изображение, чтобы оно добавилось в документ. Поскольку и метод AddPicture и метод AddOLEObject этой коллекции требуют имя файла (т.е., файл с изображением уже должен быть на диске), то надо записать картинку во временный файл, оттуда - добавить к документу, а потом - удалить:

   fn := ExtractFilePath(Application.ExeName) + 'tmp.bmp'; // Тут будет временная картинка
Chart1.SaveToBitmapFile(fn);

WordApp := CreateOleObject('Word.Application'); // А вот с эти приложением работаем
WordApp.Visible := True; // Это можно отключить, я включил, чтоб наблюдать за происходящим
WordApp.Documents.Add; // Новый документ

// Добавляем картинку из файла
WordApp.Selection.InlineShapes.AddOLEObject(ClassType:='Paint.Picture',
FileName:=fn, LinkToFile:=False, DisplayAsIcon:=False);

DeleteFile(fn); // Все, картинка больше не нужна, удаляем
Потом сохранить DOC файл, и все... Уж этих примеров в сети - море.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #95


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Хотя... Что тебе надо делать с этим изображением? Сохранить, а потом восстановить? Или просто для просмотре? Если сохранение/восстановление - то можно изображение закодировать в строку (EncodeBase64), а потом, когда нужно - раскодировать назад: DecodeBase64. На форуме embarcadero было решение подобной задачи.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #96


Пионер
**

Группа: Пользователи
Сообщений: 80
Пол: Мужской

Репутация: -  0  +


Мне надо вывести отчет о задымленности в файл, то есть исходные данные, рассчитанные данные, желательно рисунок(не обязательно, чувствую с ним много проблем будет) и графики зависимостей(TChart)....
Кстати, в связи с этим возникает вопрос, а график TChart наверняка выводится по похожим с Image алгоритмам?(То естьTChart нельзя вывести в один файл с Эдитами и таблицами, используя, например не word, а какой-либо более легкий метод вывода)

Сообщение отредактировано: RussoTuristo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #97


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> AddOLEObject(ClassType:='Paint.Picture',
FileName:=fn, LinkToFile:=False, DisplayAsIcon:=False);

Кстати, интересно было, что означает эта конструкция в Дельфи?
(хахаха, это спецкостыль для OLE)

> WordApp := CreateOleObject('Word.Application');

Ты забыл дописать его удаление, а ведь у них, в отличие от неудалённых указателей, последствия похуже - лишний процесс повиснет в памяти.

И ещё, почему у меня не получалось сделать так, чтобы одновременно работала подобная программа и я мог что-то набирать в другом документе (при выборе другого документа моя программа тоже переключалась на него)?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #98


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
Ты забыл дописать его удаление
С чего бы? Я ж ясно написал:
Цитата
Потом сохранить DOC файл
Или удалить надо было до сохранения? Или надо было написать полный код, чтоб ТС только скопировал и добавил к себе?

Цитата
почему у меня не получалось сделать так, чтобы одновременно работала подобная программа и я мог что-то набирать в другом документе
Потому что я использовал свойства, которые относятся к текущему (активному) документу/приложению. Если надо одновременно работать вручную - с одним документом, а автоматически - с другим, то нужно переписывать код по-другому. Обычно такой задачи не стоит.

Цитата
(хахаха, это спецкостыль для OLE)
Это - костыль? Ты еще работу с OLE в Билдере не видел. Вот там - костыль, так костыль... А в Дельфи - практически повторен стиль VBA.

Цитата(RussoTuristo)
используя, например не word, а какой-либо более легкий метод вывода
Пример более легкого метода, чем Word, можно привести? В Word картинка добавляется одной строкой, как видишь.

Сообщение отредактировано: IUnknown -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #99


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> Или удалить надо было до сохранения? Или надо было написать полный код, чтоб ТС только скопировал и добавил к себе?

Надо было написать "потом сохранить и обязательно удалить не забудь".

> Если надо одновременно работать вручную - с одним документом, а автоматически - с другим, то нужно переписывать код по-другому.

А насколько именно по-другому?

> Ты еще работу с OLE в Билдере не видел.

Да, не видел...


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #100


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
А насколько именно по-другому?
Ну, как-то вот так (набираю прямо здесь, так что где-то могу и накосячить) :

// во-первых, создаем OLE-объект только тогда, когда он еще не создан,
// иначе подключаемся уже к работающему:
try
WordApp := GetActiveOleObject('Word.Application');
except
WordApp := CreateOleObject('Word.Application');
end;

// во-вторых, при создании нового документа надо получить на него ссылку:
new_doc := wordapp.Documents.Add; // var new_doc : variant
// и потом добавлять объект именно к новому документу
new_doc.{selection.}InlineShapes.AddOLEObject(...)
вот насчет необходимости Selection я не уверен, может быть оно там и не надо.

Цитата
Да, не видел...
Посмотри:
С++ Builder6 & Excel

Сообщение отредактировано: IUnknown -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

6 страниц V « < 3 4 5 6 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 18.04.2024 13:45
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name