» Вопросы по Delphi (до версии 2009) - часть 6
Frodo_Torbins спасибо огромное!
gx90
Можно руками в ходе программирования ctrl + I и ctrl + U выделенный кусок текста.
Можно руками в ходе программирования ctrl + I и ctrl + U выделенный кусок текста.
Frodo_Torbins, snike555 - спасибо!
Hi All
D7 : Форма перестала запоминать свойства выставленные в Дезайн тайм
закрываеш и открывает проект , все слетает
Прямо в DFM проблемной формы смотрю, после закрытия D7 все ОК
Код: object dxBarManagerMain: TdxBarManager
ImageOptions.Images = DM.cxImageListMain
D7 : Форма перестала запоминать свойства выставленные в Дезайн тайм
закрываеш и открывает проект , все слетает
Прямо в DFM проблемной формы смотрю, после закрытия D7 все ОК
Код: object dxBarManagerMain: TdxBarManager
ImageOptions.Images = DM.cxImageListMain
Открой сначала DM модуль, а потом форму проблемную... Ну а лучше всего - выставляй в ран-тайм... Понимаю, что в дизайн проще, но убережешь себя от того, что некоторые свойства будут слетать
Цитата:
Открой сначала DM модуль, а потом форму проблемную... Ну а лучше всего - выставляй в ран-тайм...
1) Непонял , DM модуль и Форма в одном ведь проекте
2) В Ран тайм можно , но мне например надо видеть картинки в Главном меню .
3) А вдруг это выйдет боком потом
1. Ну и что, что в одном проекте... DM не открывается и форма не может подтянуть его компоненты вот и слетают настройки
2. Можете как и в дизайн-тайм так и в ран-тайм выставлять.
3. Выйдет плохо только если в дизайн-тайм оставить. В ран-тайм - ничего не выйдет плохого (если конечно правильные выставить)
2. Можете как и в дизайн-тайм так и в ран-тайм выставлять.
3. Выйдет плохо только если в дизайн-тайм оставить. В ран-тайм - ничего не выйдет плохого (если конечно правильные выставить)
salexn1 А может DFM описание проблемной формы как то порушиться ???
Не понял вопрос?
salexn1
Ну описание свойств у формы . Может как то повредилось.
Цитата:
Ну описание свойств у формы . Может как то повредилось.
Цитата:
object FormMain: TFormMain
Left = 266
Top = 221
Width = 981
Height = 559
Caption = #1040#1073#1086#1085#1077#1085#1090' 8'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -10
Font.Name = 'MS Sans Serif'
Font.Style = []
FormStyle = fsMDIForm
OldCreateOrder = False
Position = poScreenCenter
Visible = True
WindowState = wsMaximized
Цитата:
Прямо в DFM проблемной формы смотрю, после закрытия D7 все ОК
Это же вы писали. Значит все ок.
У 7 Delphi (не знаю как в версиях постарше) это "нормально", когда слетают настройки контролов, свойства которых лежат на других формах\модулях. Сам не раз нарывался. Потом устал бороться и сделал все в ран-тайм. Точнее, только те, которые лежат на ДРУГИХ модулях: в частности привязку всех Images к action, toolbars и т.д., DataSet с DataSource и т.д. и т.п.
З.Ы.
Кстати и в Java и в C# там сделано "имхо" умнее: все переводится в ран-тайм код
Нужно решить такую задачу.
Имеется файл где хранится библиотека картинок. Файл большого размера ~ 600 мб.
Нужно прочитать картинку из файла и отобразить ее в Timage. Смещение картинки в файле относительно начала известно.
Как решить задачу?
Имеется файл где хранится библиотека картинок. Файл большого размера ~ 600 мб.
Нужно прочитать картинку из файла и отобразить ее в Timage. Смещение картинки в файле относительно начала известно.
Как решить задачу?
Aladdinych
Через поток
Image.Picture.Bitmap.LoadFromStream();
или через клипбоард
Image.Picture.Bitmap.LoadFromClipboardFormat();
Через поток
Image.Picture.Bitmap.LoadFromStream();
или через клипбоард
Image.Picture.Bitmap.LoadFromClipboardFormat();
Кто может помочь решить задачи по Delphi? Например: Создание оболочки для автоматизации пакета методик»
1. Создать папку (например С:/ППОРПЗ/ Группа/Фамилия/Proba)
Сохранить проект Proba.dpr ( Сохранить модуль, как Mainunit.pas)
2. Работа с формой:
В инспекторе объектов найдите свойства и заполните:
Name----MainForm
Caption----- «Главная форма»
Размещаем элементы:
Button1: Caption—«Информация о разработчиках»
Button2: Caption—«Описание методик»
Button3: Caption—«Тестирование»
Button4: Caption—«Результаты исследования»
Bitbtn1----kind---bcclose; Caption -----«Выход»
MainMenu1- продублируйте названия пунктов меню-названия кнопок.
Это не все задание, только начало. Помимо этого есть еще.
Сам в Delphi не шарю.
P.S. безответственных личностей прошу не беспокоить!
1. Создать папку (например С:/ППОРПЗ/ Группа/Фамилия/Proba)
Сохранить проект Proba.dpr ( Сохранить модуль, как Mainunit.pas)
2. Работа с формой:
В инспекторе объектов найдите свойства и заполните:
Name----MainForm
Caption----- «Главная форма»
Размещаем элементы:
Button1: Caption—«Информация о разработчиках»
Button2: Caption—«Описание методик»
Button3: Caption—«Тестирование»
Button4: Caption—«Результаты исследования»
Bitbtn1----kind---bcclose; Caption -----«Выход»
MainMenu1- продублируйте названия пунктов меню-названия кнопок.
Это не все задание, только начало. Помимо этого есть еще.
Сам в Delphi не шарю.
P.S. безответственных личностей прошу не беспокоить!
Цитата:
У 7 Delphi (не знаю как в версиях постарше) это "нормально", когда слетают настройки контролов, свойства которых лежат на других формах\модулях
То есть решение проблемы в установке D 2007 (не все компоненты я смотрел перевели на более старшие версии)???
Ибо твориться что то странное . Я например когда ставлю на проблемной форме
Form1.tag=10 , то dxBarmanager меняет свой стиль и становиться голубым в Дизайн-Тайм (После перезагрузки проекта)
Czechoslovak
Я пробовал проанализировать содержиное этого файла.
Получается, что он состоит из блоков, каждый из которых содержит:
1. Индекс изображения.
2. Длину тела изображения.
3. Собственно построчное тело изображения.
И более ничего.
Тело изображения такое же как, например в BMP файле начиная со смещения 1078.
Сам по себе блок данных не является BMP файлом.
я пробовал выделять это тело и отправлять в Timage след образом
image1.Picture.Bitmap.LoadFromStream(imgbuf)
но при выполнении этой строки генерируется ошибка: Bitmap image is not valid.
Информация о палитре как таковая в блоке отсутствует.
Но я знаю что изображение должно быть полутоновын в серых тонах.
Как победить проблему?
Я пробовал проанализировать содержиное этого файла.
Получается, что он состоит из блоков, каждый из которых содержит:
1. Индекс изображения.
2. Длину тела изображения.
3. Собственно построчное тело изображения.
И более ничего.
Тело изображения такое же как, например в BMP файле начиная со смещения 1078.
Сам по себе блок данных не является BMP файлом.
я пробовал выделять это тело и отправлять в Timage след образом
image1.Picture.Bitmap.LoadFromStream(imgbuf)
но при выполнении этой строки генерируется ошибка: Bitmap image is not valid.
Информация о палитре как таковая в блоке отсутствует.
Но я знаю что изображение должно быть полутоновын в серых тонах.
Как победить проблему?
Aladdinych
Попробуйте image1.Picture.LoadFromStream(imgbuf) - так делфи попробует сама определить правильный формат.
Попробуйте image1.Picture.LoadFromStream(imgbuf) - так делфи попробует сама определить правильный формат.
Frodo_Torbins
У объекта Picture нет метода LoadFromStream (Delphi 5)
У объекта Picture нет метода LoadFromStream (Delphi 5)
Aladdinych
ну если у тебя там bmp файл то он должен соответствовать спецификации http://ru.wikipedia.org/wiki/BMP, по крайне мере первый две буквы должны быть BM
за то есть Picture.LoadFromClipboardFormat так что можешь через буфер попробывать
ну если у тебя там bmp файл то он должен соответствовать спецификации http://ru.wikipedia.org/wiki/BMP, по крайне мере первый две буквы должны быть BM
за то есть Picture.LoadFromClipboardFormat так что можешь через буфер попробывать
Что можно сделать с
[Error] cache.dpr(4804): Too many local constants. Use shorter procedures
У меня написана процедура
procedure dependencies (payloadid: string; payloadidb: string; typeid: Integer);
И вызывать ее мне надо много раз, ибо она заносит значения в некоторую БД, где то раз 4000
dependencies('{2C8FBE83-2D3E-4CE6-A912-4BED85BCAC06}','{0D067D13-C3D7-4EA6-B346-740CD91FD547}',6);
и так с разными параметрами.
Как лучше поступить здесь?
[Error] cache.dpr(4804): Too many local constants. Use shorter procedures
У меня написана процедура
procedure dependencies (payloadid: string; payloadidb: string; typeid: Integer);
И вызывать ее мне надо много раз, ибо она заносит значения в некоторую БД, где то раз 4000
dependencies('{2C8FBE83-2D3E-4CE6-A912-4BED85BCAC06}','{0D067D13-C3D7-4EA6-B346-740CD91FD547}',6);
и так с разными параметрами.
Как лучше поступить здесь?
Sergey_Demchuk
Тоесть ваш код выглядит приблизительно так:
Код: //...
dependencies('{2C8FBE83-2D3E-4CE6-A912-4BED85BCAC06}','{0D067D13-C3D7-4EA6-B346-740CD91FD547}',6);
dependencies('{1D8FEB91-67AE-44F5-B871-5BAD75BCFC82}','{4EA586BA-009B-4DC2-BAC8-CEFFF0C662A0}',5);
dependencies('{EC0741B0-5C31-4AAC-AAD2-B0087AE69A41}','{77B5E4B6-6B6F-44E7-BAD3-730E7FCFE26B}',7);
dependencies('{B7CE532A-8B0D-489C-BF32-BAD33E2C8152}','{C39FABE1-C778-4E77-AB79-EABCBBB74403}',3);
dependencies('{718E4394-86E1-4B34-8A80-40C488042D58}','{9FEAE608-DE4F-439E-9771-FF6C9358D020}',4);
//...
Тоесть ваш код выглядит приблизительно так:
Код: //...
dependencies('{2C8FBE83-2D3E-4CE6-A912-4BED85BCAC06}','{0D067D13-C3D7-4EA6-B346-740CD91FD547}',6);
dependencies('{1D8FEB91-67AE-44F5-B871-5BAD75BCFC82}','{4EA586BA-009B-4DC2-BAC8-CEFFF0C662A0}',5);
dependencies('{EC0741B0-5C31-4AAC-AAD2-B0087AE69A41}','{77B5E4B6-6B6F-44E7-BAD3-730E7FCFE26B}',7);
dependencies('{B7CE532A-8B0D-489C-BF32-BAD33E2C8152}','{C39FABE1-C778-4E77-AB79-EABCBBB74403}',3);
dependencies('{718E4394-86E1-4B34-8A80-40C488042D58}','{9FEAE608-DE4F-439E-9771-FF6C9358D020}',4);
//...
Я так понял, что просто в коде слишком много литер, что за такое ограничение? Если я буду загонять все значения в массив, все равно код короче не будет.
Добавлено:
Frodo_Torbins
Именно так и выглядит
Добавлено:
Frodo_Torbins
Именно так и выглядит
Sergey_Demchuk
Цитата:
Вот что говорят на сайте Эмбаркадере
Цитата:
мой совет - константы загнать в текстовый файл - инишку (чтобы не бить кучу констант в коде) примерно в таком виде
payloadid_1 = {2C8FBE83-2D3E-4CE6-A912-4BED85BCAC06}
payloadidb_1 = {0D067D13-C3D7-4EA6-B346-740CD91FD547}
в процедуре считывай примерно так
payloadid := Ini.ReadIni(Section, 'payloadid_'+IntToStr(i),'');
payloadidb := Ini.ReadIni(Section, 'payloadidb_'+IntToStr(i),'');
и уже вызывать
dependencies(payloadid,payloadidb,i);
инишку при желании заменить на типизированный (или обычный) файл и считывать в динамический массив. При этом читабельность кода улучшится, так как не будет 4000 строк с одним смыслом.
Вплоть до того, что если работа идет с базой данных,то все параметры загнать в таблицу со структурой
ID payloadid payloadidb TypeId
и при необходимости выбирать нужную запись по typeid.
Вариантов куча, выбирай любой.
Цитата:
Я так понял, что просто в коде слишком много литер, что за такое ограничение? Если я буду загонять все значения в массив, все равно код короче не будет.
Вот что говорят на сайте Эмбаркадере
Цитата:
One or more of your procedures contain so many string constant expressions that they exceed the compiler's internal storage limit. This can occur in code that is automatically generated. To fix this, you can shorten your procedures or declare contant identifiers instead of using so many literals in the code.
мой совет - константы загнать в текстовый файл - инишку (чтобы не бить кучу констант в коде) примерно в таком виде
payloadid_1 = {2C8FBE83-2D3E-4CE6-A912-4BED85BCAC06}
payloadidb_1 = {0D067D13-C3D7-4EA6-B346-740CD91FD547}
в процедуре считывай примерно так
payloadid := Ini.ReadIni(Section, 'payloadid_'+IntToStr(i),'');
payloadidb := Ini.ReadIni(Section, 'payloadidb_'+IntToStr(i),'');
и уже вызывать
dependencies(payloadid,payloadidb,i);
инишку при желании заменить на типизированный (или обычный) файл и считывать в динамический массив. При этом читабельность кода улучшится, так как не будет 4000 строк с одним смыслом.
Вплоть до того, что если работа идет с базой данных,то все параметры загнать в таблицу со структурой
ID payloadid payloadidb TypeId
и при необходимости выбирать нужную запись по typeid.
Вариантов куча, выбирай любой.
XL:= CreateOleObject('Excel.Application');
XL.Workbooks.Add('g:\!_BASES\ЗАПАДНАЯ\DATA\ООО Атол 29,07,2010.xls');
//не показывать предупреждающие сообщения
XL.DisplayAlerts := False;
//Открывать Excel на полный экран
XL.WindowState := xlMaximized;
XL.Visible := True;
Windows.SetParent(XL.HWND, Form1.PN.Handle); // Помещаю эксель на панель
Вопрос: Как при изменении размера основной формы делать так чтоб размер экселя автоматом вписывался в измененный размер панели типа Align = alClient
XL.Workbooks.Add('g:\!_BASES\ЗАПАДНАЯ\DATA\ООО Атол 29,07,2010.xls');
//не показывать предупреждающие сообщения
XL.DisplayAlerts := False;
//Открывать Excel на полный экран
XL.WindowState := xlMaximized;
XL.Visible := True;
Windows.SetParent(XL.HWND, Form1.PN.Handle); // Помещаю эксель на панель
Вопрос: Как при изменении размера основной формы делать так чтоб размер экселя автоматом вписывался в измененный размер панели типа Align = alClient
ShIvADeSt
В текстовом файле у меня уже есть данные в таком виде
...
{92D58719-BBC1-4CC3-A08B-56C9E884CC2C},{D7BF3B76-EEF9-4868-9B2B-42ABF60B279A},1
{D92BBB52-82FF-42ED-8A3C-4E062F944AB7},{7FF0ACFE-4346-4D9D-B822-C69B99AAE1FC},1
{D1A19B02-817E-4296-A45B-07853FD74D57},{8AE28FB8-B8AE-4B58-A5FE-77F45E462BAE},1
{E4E188D2-27D5-4E4C-92CE-87F9D24AD2F6},{03169F19-B7D6-4569-AE75-5DD39854AACD},1
{E4E188D2-27D5-4E4C-92CE-87F9D24AD2F6},{0463F1EC-917C-4432-92F6-F424180889DF},1
...
Как бы то их лучше загнать в динамический массив?
Я пробую что то типа такого
var
f: TextFile; // файл
buf: String[80]; // буфер для чтения строк
myarr:array of string;
arr: Integer;
AssignFile(f, 'dependencies.txt');
Reset(f); // открыть для чтения
// чтение из файла
arr:=0;
while not EOF(f) do
begin
readln(f, buf); // прочитать строку из файла
myarr[arr]:=buf;
SetLength(myarr, 1);
arr:=arr+1;
ShowMessage(buf);
end;
CloseFile(f); // закрыть файл
Выдает ошибку в памяти по какому то адресу...
В текстовом файле у меня уже есть данные в таком виде
...
{92D58719-BBC1-4CC3-A08B-56C9E884CC2C},{D7BF3B76-EEF9-4868-9B2B-42ABF60B279A},1
{D92BBB52-82FF-42ED-8A3C-4E062F944AB7},{7FF0ACFE-4346-4D9D-B822-C69B99AAE1FC},1
{D1A19B02-817E-4296-A45B-07853FD74D57},{8AE28FB8-B8AE-4B58-A5FE-77F45E462BAE},1
{E4E188D2-27D5-4E4C-92CE-87F9D24AD2F6},{03169F19-B7D6-4569-AE75-5DD39854AACD},1
{E4E188D2-27D5-4E4C-92CE-87F9D24AD2F6},{0463F1EC-917C-4432-92F6-F424180889DF},1
...
Как бы то их лучше загнать в динамический массив?
Я пробую что то типа такого
var
f: TextFile; // файл
buf: String[80]; // буфер для чтения строк
myarr:array of string;
arr: Integer;
AssignFile(f, 'dependencies.txt');
Reset(f); // открыть для чтения
// чтение из файла
arr:=0;
while not EOF(f) do
begin
readln(f, buf); // прочитать строку из файла
myarr[arr]:=buf;
SetLength(myarr, 1);
arr:=arr+1;
ShowMessage(buf);
end;
CloseFile(f); // закрыть файл
Выдает ошибку в памяти по какому то адресу...
Sergey_Demchuk
Позволю себе встрять
1. Почему SetLength(myarr, 1); стоит после myarr[arr]:=buf;? Просто объявление переменной типа динамический массив не распределяет память под его элементы, фактически такая переменная - указатель и сразу после объявления она равна nil. Получается, сперва делается попытка записать значение в еще нераспределенную память для элемента массива, а потом только делается выделение памяти под этот элемент... Надо бы наоборот.
2. Почему в вызове SetLength(myarr, 1); размер массива всегда равен 1? Почитай хелп по ф-ции... Правильно в данном случае SetLength(myarr, arr+1);
3. Но выделять память на каждом шаге цикла 4000 раз - не эффективно в плане быстродействия... Лучше выделять память блоками сразу скажем по 100 элементов (при необходимости, увеличивая еще на 100 и так далее)... После выхода из цикла сделать еще раз SetLength(myarr, arr); - этим отсекутся неиспользованные ранее выделенные элементы...
ЗЫ: если сложно с динамическим массивом, могу порекомендовать список TStringList...
Позволю себе встрять
1. Почему SetLength(myarr, 1); стоит после myarr[arr]:=buf;? Просто объявление переменной типа динамический массив не распределяет память под его элементы, фактически такая переменная - указатель и сразу после объявления она равна nil. Получается, сперва делается попытка записать значение в еще нераспределенную память для элемента массива, а потом только делается выделение памяти под этот элемент... Надо бы наоборот.
2. Почему в вызове SetLength(myarr, 1); размер массива всегда равен 1? Почитай хелп по ф-ции... Правильно в данном случае SetLength(myarr, arr+1);
3. Но выделять память на каждом шаге цикла 4000 раз - не эффективно в плане быстродействия... Лучше выделять память блоками сразу скажем по 100 элементов (при необходимости, увеличивая еще на 100 и так далее)... После выхода из цикла сделать еще раз SetLength(myarr, arr); - этим отсекутся неиспользованные ранее выделенные элементы...
ЗЫ: если сложно с динамическим массивом, могу порекомендовать список TStringList...
psa1974
Верно, сделал так
arr:=0; arrLength:=100; SetLength(myarr,100);
while not EOF(f) do
begin
readln(f, buf); // прочитать строку из файла
myarr[arr]:=buf;
if (arrLength-arr)<=1 then
begin
SetLength(myarr, arrLength+100);
arrLength:=arrLength+100;
end;
arr:=arr+1;
// ShowMessage(buf);
end;
CloseFile(f); // закрыть файл
Теперь работает.
Как бы теперь расчленить вот эту строку из масива
{92D58719-BBC1-4CC3-A08B-56C9E884CC2C},{D7BF3B76-EEF9-4868-9B2B-42ABF60B279A},1
на отдельные элементы
{92D58719-BBC1-4CC3-A08B-56C9E884CC2C}
{D7BF3B76-EEF9-4868-9B2B-42ABF60B279A}
1
Это, насколько я понимаю, придется еще три массива дополнительно создавать?
Верно, сделал так
arr:=0; arrLength:=100; SetLength(myarr,100);
while not EOF(f) do
begin
readln(f, buf); // прочитать строку из файла
myarr[arr]:=buf;
if (arrLength-arr)<=1 then
begin
SetLength(myarr, arrLength+100);
arrLength:=arrLength+100;
end;
arr:=arr+1;
// ShowMessage(buf);
end;
CloseFile(f); // закрыть файл
Теперь работает.
Как бы теперь расчленить вот эту строку из масива
{92D58719-BBC1-4CC3-A08B-56C9E884CC2C},{D7BF3B76-EEF9-4868-9B2B-42ABF60B279A},1
на отдельные элементы
{92D58719-BBC1-4CC3-A08B-56C9E884CC2C}
{D7BF3B76-EEF9-4868-9B2B-42ABF60B279A}
1
Это, насколько я понимаю, придется еще три массива дополнительно создавать?
Цитата:
Позволю себе встрять
И я тоже
Sergey_Demchuk
Цитата:
Это, насколько я понимаю, придется еще три массива дополнительно создавать?
Необязательно. Немного перепишите процедуру dependencies, передавайте в неё всю строку, а потом парсите:
Код: ...uses
..., StrUtils;
procedure dependencies (S: string);
var
l, r: integer;
payloadid: string;
payloadidb: string;
typeid: Integer;
begin
l := pos('{', S); r := posex('}', S, l);
payloadid := copy(s, l, r-l+1);
l := posex('{', S, r); r := posex('}', S, l);
payloadidb := copy(s, l, r-l+1);
l := posex(',', S, r);
typeid := StrToInt(copy(s, l+1, maxint));
...
Sergey_Demchuk
Цитата:
Можно сделать трехмерный массив типа
type
DepItem : array[1..3] of string;
a:array of DepItem;
тогда можно будет вызывать примерно так
a[1,1] - первый парам
a[1,2] - второй парам
a[1,3] - третий парам
с порядком индексов может напутал, но смысл думаю ясен.
Цитата:
Это, насколько я понимаю, придется еще три массива дополнительно создавать?
Можно сделать трехмерный массив типа
type
DepItem : array[1..3] of string;
a:array of DepItem;
тогда можно будет вызывать примерно так
a[1,1] - первый парам
a[1,2] - второй парам
a[1,3] - третий парам
с порядком индексов может напутал, но смысл думаю ясен.
Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
Предыдущая тема: MPO File
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.