Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 5

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


 
Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].


    Некоторые "родственные" топики:
     
  • Вопросы по Delphi (версии 2009-2010 Weaver)
  • Вопросы по компонентам для Delphi, C++ Builder
  • Использование DevExpress
  • Вопросы по Ehlib
  • Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
  • Коммерческие компоненты и утилиты для Delphi/BCB
  • кабак программистов :)
     
    См. также: Некоторые полезные ресурсы о Delphi
     
    И старайтесь, чтобы ваш код не попал сюда :)

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: akaGM, 02:33 15-07-2020
    JohnSilver182



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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

    Всего записей: 829 | Зарегистр. 03-06-2009 | Отправлено: 15:39 04-08-2010
    salexn1



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Прямо в DFM проблемной формы смотрю, после закрытия D7 все ОК

    Это же вы писали. Значит все ок.
     
    У 7 Delphi (не знаю как в версиях постарше) это "нормально", когда слетают настройки контролов, свойства которых лежат на других формах\модулях. Сам не раз нарывался. Потом устал бороться и сделал все в ран-тайм. Точнее, только те, которые лежат на ДРУГИХ модулях: в частности привязку всех Images к action, toolbars и т.д., DataSet с DataSource и т.д. и т.п.
     
    З.Ы.
    Кстати и в Java и в C# там сделано "имхо" умнее: все переводится в ран-тайм код

    Всего записей: 502 | Зарегистр. 21-02-2008 | Отправлено: 16:16 04-08-2010 | Исправлено: salexn1, 16:22 04-08-2010
    Aladdinych



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Нужно решить такую задачу.
    Имеется файл где хранится библиотека картинок. Файл большого размера ~ 600 мб.
    Нужно прочитать картинку из файла и отобразить ее в Timage. Смещение картинки в файле относительно начала известно.
    Как решить задачу?

    Всего записей: 322 | Зарегистр. 18-10-2005 | Отправлено: 09:06 06-08-2010
    Czechoslovak



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Aladdinych
    Через поток
    Image.Picture.Bitmap.LoadFromStream();
    или через клипбоард
    Image.Picture.Bitmap.LoadFromClipboardFormat();

    Всего записей: 175 | Зарегистр. 27-06-2007 | Отправлено: 09:56 06-08-2010
    popugai



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Кто может помочь решить задачи по 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. безответственных личностей прошу не беспокоить!

    Всего записей: 523 | Зарегистр. 27-09-2007 | Отправлено: 10:48 06-08-2010 | Исправлено: popugai, 10:50 06-08-2010
    JohnSilver182



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    У 7 Delphi (не знаю как в версиях постарше) это "нормально", когда слетают настройки контролов, свойства которых лежат на других формах\модулях

     
    То есть решение проблемы в установке  D 2007 (не  все компоненты я  смотрел перевели на  более старшие версии)???  
     
    Ибо твориться  что то  странное . Я например когда  ставлю на проблемной  форме  
    Form1.tag=10  , то dxBarmanager меняет свой  стиль и становиться  голубым в Дизайн-Тайм (После перезагрузки  проекта)

    Всего записей: 829 | Зарегистр. 03-06-2009 | Отправлено: 13:44 06-08-2010 | Исправлено: JohnSilver182, 13:48 06-08-2010
    Aladdinych



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Czechoslovak
    Я пробовал проанализировать содержиное этого файла.
    Получается, что он состоит из блоков, каждый из которых содержит:
    1. Индекс изображения.
    2. Длину тела изображения.
    3. Собственно построчное тело изображения.
    И более ничего.
    Тело изображения такое же как, например в BMP файле начиная со смещения 1078.
    Сам по себе блок данных не является BMP файлом.
    я пробовал выделять это тело и отправлять в Timage след образом
    image1.Picture.Bitmap.LoadFromStream(imgbuf)
    но при выполнении этой строки генерируется ошибка: Bitmap image is not valid.
    Информация о палитре как таковая в блоке отсутствует.
    Но я знаю что изображение должно быть полутоновын в серых тонах.
    Как победить проблему?

    Всего записей: 322 | Зарегистр. 18-10-2005 | Отправлено: 14:37 06-08-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aladdinych
    Попробуйте image1.Picture.LoadFromStream(imgbuf) - так делфи попробует сама определить правильный формат.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 16:06 06-08-2010
    Aladdinych



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    У объекта Picture нет метода LoadFromStream (Delphi 5)

    Всего записей: 322 | Зарегистр. 18-10-2005 | Отправлено: 16:29 06-08-2010
    Czechoslovak



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Aladdinych
    ну если у тебя там bmp файл то он должен соответствовать спецификации http://ru.wikipedia.org/wiki/BMP, по крайне мере первый две буквы должны быть BM
     
    за то есть Picture.LoadFromClipboardFormat так что можешь через буфер попробывать

    Всего записей: 175 | Зарегистр. 27-06-2007 | Отправлено: 16:41 06-08-2010 | Исправлено: Czechoslovak, 16:42 06-08-2010
    Sergey_Demchuk



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Что можно сделать с  
    [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);
     
    и так с разными параметрами.
    Как лучше поступить здесь?  

    Всего записей: 3551 | Зарегистр. 16-12-2002 | Отправлено: 12:08 08-08-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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);
    //...
    ?
    Тогда вам стоит загнать все константы в один массив, а функцию вызывать в цикле.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 12:42 08-08-2010
    Sergey_Demchuk



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Я так понял, что просто в коде слишком много литер, что за такое ограничение? Если я буду загонять все значения в массив, все равно код короче не будет.
     
    Добавлено:
    Frodo_Torbins
    Именно так и выглядит

    Всего записей: 3551 | Зарегистр. 16-12-2002 | Отправлено: 13:19 08-08-2010 | Исправлено: Sergey_Demchuk, 13:22 08-08-2010
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Sergey_Demchuk

    Цитата:
    Я так понял, что просто в коде слишком много литер, что за такое ограничение? Если я буду загонять все значения в массив, все равно код короче не будет.  

    Вот что говорят на сайте Эмбаркадере

    Цитата:
     
    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.
    Вариантов куча, выбирай любой.

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 15:35 08-08-2010
    YuriyRR



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
     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

    Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 16:20 08-08-2010
    Sergey_Demchuk



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    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); // закрыть файл
     
    Выдает ошибку в памяти по какому то адресу...

    Всего записей: 3551 | Зарегистр. 16-12-2002 | Отправлено: 20:08 08-08-2010 | Исправлено: Sergey_Demchuk, 20:53 08-08-2010
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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...

    ----------
    У программёра есть два состояния: "Втупляю" и "Попёрло"...

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 21:33 08-08-2010 | Исправлено: psa1974, 22:21 08-08-2010
    Sergey_Demchuk



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    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
     
    Это, насколько я понимаю, придется еще три массива дополнительно создавать?

    Всего записей: 3551 | Зарегистр. 16-12-2002 | Отправлено: 01:19 09-08-2010
    data man



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Позволю себе встрять

    И я тоже
     
    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));
    ...
    Но код лучше усложнить, введя проверки на корректность данных - всё-таки текстовый файл, мало ли что

    ----------
    Любой достаточно развитый тролль неотличим от подлинно помешанного на какой-либо идее.
    Кекс. Антибиотики. Ламбада.

    Всего записей: 1696 | Зарегистр. 13-10-2005 | Отправлено: 02:24 09-08-2010
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Sergey_Demchuk

    Цитата:
    Это, насколько я понимаю, придется еще три массива дополнительно создавать?  

    Можно сделать трехмерный массив типа
    type
      DepItem : array[1..3] of string;
    a:array of DepItem;
     
    тогда можно будет вызывать примерно так
    a[1,1] - первый парам
    a[1,2] - второй парам
    a[1,3] - третий парам
     
    с порядком индексов может напутал, но смысл думаю ясен.

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:00 09-08-2010
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru