Вопросы по Delphi (все версии) - часть 3 - [77] :: Прикладное программирование :: Компьютерный форум Ru.Board
Перейти из форума на сайт.

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

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

ShIvADeSt (07-04-2008 02:27): продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=9383  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vladk1973



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
All
C наступившим всех программеров и прочих рубордовцев!
 
Erazer
Если стало тяжко держать в голове всю структуру вызовов, значит необходимо изменить подход в программировании
Конечно, можно написать сотни процедур и поместить их все в одном модуле, но это не программирование - это ремесленничество на любительском уровне, имхо. Даже если кажется, что "программка то простая, чего там мудрить", нужно помнить, что аппетит приходит во время еды, возможно, вам к ней еще не раз придется возвратиться, а скорее всего - еще и баги искать. В таком коде какому другому программеру разобраться - это ж сколько человекочасов потратить надо. А грамотный код и почитать приятно, и поддерживать не трудно, да и багов в нем - поверьте, гораздо меньше случается
 
Ну к примеру.
Есть условие, в зависимости от которого нам в главной процедуре надо четыре разных процедуры вызвать. И у каждой свои параметры, как оказалось. Сначала то думали, что одинаковые параметры, а потом выяснилось что... Ну и так далее.
Вот и начинаем "ветвления"
  if условие1 then ПолучаемПараметры1 и вызываем процедуру 1;
  if условие2 then ПолучаемПараметры2 и вызываем процедуру 2;
  if условие3 или условие4 then begin
     ПолучаемПараметры3  
     if условие3 then вызываем процедуру 3 else
       ПолучаемДополнительныйПараметр4 и вызываем процедуру 4;
 
Такой бардак в коде - сплошь и рядом. Страшно отлаживать что то подобное, особенно когда процедуры имеют невразумительные названия, типа "MyProc12"
 
А что стоит сделать вот так:
Реализуешь четыре объекта, и ссылку на базовый класс

Код:
 
  TMyObject1 = class
    procedure Initialize; virtual;
    procedure Run; virtual;
  end;
 
  TMyObject2 = class(TMyObject1)
  public
    procedure Initialize; override;
    procedure Run; override;
  end;
 
  TMyObject3 = class(TMyObject1)
    procedure Initialize; override;
    procedure Run; override;
  end;
 
  TMyObject4 = class(TMyObject1)
    procedure Initialize; override;
    procedure Run; override;
  end;
 
  TMyClass = class of TMyObject1;
 
 
Оформляешь свои события в перечисляемый тип и создаешь массив с индексом этого типа.  

Код:
  TMyEvents = (event1,event2,event3,event4);
  TMyObjectsArray = array[TMyEvents] of TMyClass;
 

А экземпляры массива пусть будут как раз твои классы

Код:
initialization
  MyObjectsArray[event1] := TMyObject1;
  MyObjectsArray[event2] := TMyObject2;
  MyObjectsArray[event3] := TMyObject3;
  MyObjectsArray[event4] := TMyObject4;
 
 
 
По сути все. Все твое ветвление выливается вот в такую вот процедуру

Код:
 
procedure Vetvlenie(const MyEvent: TMyEvents);
begin
  with MyObjectsArray[MyEvent].Create do
  try
    Initialize;
    Run;
  finally
    Free;
  end;
end;

 
Плюс ко всему никаких сторонних программ не надо, вся иерархия будет показана в инспекторе объектов. Имхо, красивее и понятнее.

Всего записей: 674 | Зарегистр. 23-03-2005 | Отправлено: 08:47 01-01-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Захотелось как можно меньше сделать код программы и размер исполняемого файла. Но возникла проблема. В процессе работы программы необходима функция Format (в SysUtils находится), но если ее подключить к проекту, то размера программы будет увеличен на 20-25 кб, что не есть гуд для программы на одном WinApi. Есть ли решение данной проблемы? Спасибо.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 13:44 01-01-2008
vladk1973



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Maks150988
Решения в лоб нет. Можно попытаться вытащить функцию и использовать ее отдельно от SysUtils. Если мне не изменяет память, она использует FormatBuf на ассемблере, можно использовать прямо ее.

Всего записей: 674 | Зарегистр. 23-03-2005 | Отправлено: 13:57 01-01-2008
Jokerjar79



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Maks150988, используй обычный write/writeln, указав параметры через запятую, а также функции val и str.

Всего записей: 710 | Зарегистр. 08-09-2007 | Отправлено: 14:00 01-01-2008
vladk1973



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

Цитата:
используй обычный write/writeln

Вместо функции SysUtils.Format? Это что то новое

Всего записей: 674 | Зарегистр. 23-03-2005 | Отправлено: 14:22 01-01-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vladk1973
Да пробовал. Но через 10 минут копирования ассемблерных листингов и функций бросил эту затею, накопировав тысячи строк.((
Jokerjar79
Дайте примерчик. Сразу после 1 числа нового года и не въедешь.))
 
п.с. ну как сказать. вообще мне надо заюзать функцию stringreplace. ей надо format. той надо str* функции и пошло поехало... стрингреплэйсом заменяю %s на одно значение, вот и понадобилась она. видать без sysutils не обойтись...
 
И кстати подскажите как на WinApi в ListBox засунуть чекбоксы и работать с ними.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 14:22 01-01-2008
Jokerjar79



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
vladk1973, ээээ, думал что Format именно для вывода используется. Если нет, то тогда можно конкатинацию строк юзать, при этом числовые значения конвертировать при помощи str
 
 
Добавлено:
Пример:

Код:
{$apptype console}
 
uses
  Sysutils;
 
var
  s: string;
  d: integer;
 
function tostr(d: integer): string;
var
  s: string;
begin
  str(d,s);
  result := s;
end;
 
begin
  d := 55;
  s := '';
  s := Format('d = %d!!!',[d]); //С format
  s := '';
  s := 'd = ' + tostr(d) + '!!!'; //Без format
end.
 

 
З.Ы. Можно свою функцию Format написать, воспользовавшись алгоритмом конечных автоматов

Всего записей: 710 | Зарегистр. 08-09-2007 | Отправлено: 15:46 01-01-2008
Erazer



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
напомните плз как вызвать метод другого модуля delphi?

Всего записей: 1731 | Зарегистр. 02-08-2003 | Отправлено: 17:11 01-01-2008
vladk1973



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Erazer
Модуль.метод
Это если одноименные процедуры имеются
Ну и не забывай в Uses модули прописывать

Всего записей: 674 | Зарегистр. 23-03-2005 | Отправлено: 17:24 01-01-2008 | Исправлено: vladk1973, 17:26 01-01-2008
Erazer



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
пасип, но все это я  знаю... до 1 -го места... поля формы видятся, а вот функции нифига.... ниче не понимаю...

Всего записей: 1731 | Зарегистр. 02-08-2003 | Отправлено: 17:53 01-01-2008
Jokerjar79



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Erazer, скорей всего, нужны прототипы функции.  Есть, допустим, в модуле функция somefunc, берешь ее прототип (имя, входные и выходные параметры) и прописываешь до ключевого слова implementation. Попробуй

Всего записей: 710 | Зарегистр. 08-09-2007 | Отправлено: 18:47 01-01-2008
ymg2000



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Erazer
Лучше приведи фрагмент кода - тогда проще будет разобраться с областью видимости. А так непонятно: ты не видишь процедуры или методы класса.

Всего записей: 2391 | Зарегистр. 24-08-2007 | Отправлено: 20:33 01-01-2008
vladk1973



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Erazer
Методы класса видны в другом модуле, если они обьявлены в секции не ниже public в описании класса
Для потомков класса также видны методы из секции protected

Всего записей: 674 | Зарегистр. 23-03-2005 | Отправлено: 20:59 01-01-2008
OdesitVadim



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

Цитата:
необходима функция Format

Можно использовать wsprintf - она экспортируется с системных длл. кода должно добавить немного. Читать здесь http://www.delphikingdom.com/asp/viewitem.asp?catalogid=586.
Также почитайте комментарии к статье

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 22:11 01-01-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Такс возник еще один вопрос. Использую трекбар и работаю с контролами на одном вин апи. Решил сделать примерчик для применения прозрачности окна программы путем перемещения трекбара. Все бы ничего, да вот когда трекбар становится в начальное нулевое значение, окно не ставится полностью прозрачным. Там прозрачность где-то 150. Далее код и ресурс. А то аттачи сюда нельзя прикладывать, поэтому текст...
 
Читать дальше.. [?]
 
И еще к этому тогда вопрос. Как можно применить стили [необходима разметка (ну шкала там или как ее назвать) и всплывающая вверху подсказка с отображением позиции слайдера] к трекбару. Дайте плиз примерчик.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 02:42 02-01-2008
SERGE_BLIZNUK

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

Цитата:
Захотелось как можно меньше сделать код программы и размер исполняемого файла.
Если задача позволяет, рекомендую попробовать KOL and MCK : http://kolnmck.ru/start.shtml или оф.сайт KOL  MCK. На этих же сайтах есть статьи, примеры и т.д. Недостаток применения данной технологии состоит в том, что прийдётся ПОЛНОСТЬЮ отказаться от VCL.  

Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 09:43 02-01-2008 | Исправлено: SERGE_BLIZNUK, 09:55 02-01-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SERGE_BLIZNUK да нунафиг этот KOL.
 
п.с. меня попросили соорудить программку для воспроизведения потокового аудио через bass.dll. вообщем глянул я там пример с ней и надо мне было переделать под вин апи (на vcl было бы попроще).
 
Читать дальше.. [?]
проблемка в том что я не знаю как переконвертировать число в процентах буферизации - слишком большое оно получается. может в функции format поделить надо или с integer поиграться?

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 23:13 02-01-2008
Chukotka

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maks150988
Что-то мне подсказывает, что те, кому
Цитата:
надо переделать под вин апи
редко испытывают затруднения с вопросами типа

Цитата:
я не знаю как переконвертировать число в процентах буферизации

Может все-таки
Цитата:
на vcl было бы попроще

А после того, как все отладите под vcl, можно и на WinAPI пробовать.

Всего записей: 429 | Зарегистр. 01-11-2006 | Отправлено: 00:28 03-01-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Chukotka
да не тут такое дело. я впервые с библиотекой bass работаю. в демо примере там код на vcl. сейчас только понял как надо правильно сделать. только вот проблема при отображении процентов буферизации: слишком сильно мерцает контрол при обновлении, хотя сама информация обновляется раз в секунду. в чем может быть проблема?

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 02:09 03-01-2008
Chukotka

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

Цитата:
слишком сильно мерцает контрол при обновлении, хотя сама информация обновляется раз в секунду

А откуда значение раз в секунду? Насколько я могу судить по коду, там идет постоянное обновление данных о буферизации в цикле. Попробуйте слать сообщение только при изменении информации:

Код:
 
Curr := (BASS_StreamGetFilePosition(chan, BASS_FILEPOS_DOWNLOAD) -  
  BASS_StreamGetFilePosition(chan, BASS_FILEPOS_CURRENT)) * 100 div len;  
// percentage of buffer filled
if (Curr <> Progress) then
begin
  progress := Curr;

  SendMessage(hwin, WM_COMMAND, 2, progress); // show the Progess value in the label  
end;
 

Ну и, соответственно, проинитить progress := MAXDWORD перед циклом.

Всего записей: 429 | Зарегистр. 01-11-2006 | Отправлено: 03:26 03-01-2008 | Исправлено: Chukotka, 03:27 03-01-2008
   

Страницы: 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

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 3
ShIvADeSt (07-04-2008 02:27): продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=9383


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru