Обсуждение Программирование на Delphi/Pascal

XoD

Самец :)
Награды
6
Не, парни, ну а как вы хотите? Чтобы пусть даже знающий человек тратил свое личное время на то, чтобы разжевать и вбить в голову начинающего (далеко не всегда умного, сообразительного и легко схватывающего умные мысли) всё по специфике заданного вопроса, а то еще и код готовый написал? Тогда вам куда-нибудь на freelance.ru, где вы оплатите знающему человеку его личное время, потраченное на вас. Это ведь не какая-то элементарщина, типа как правильно компоненты на форме расставить или как работать с их свойствами и евентами, где и пяти минут времени не уйдет, чтобы доступно расписать в посте всю подноготную вопроса. Посмотрите даже в инете на форумы, где опытные программисты консультируют начинающих по их вопросам (не важно, о какой среде разработки идет речь): везде только ПОМОГАЮТ решить задачу, а не решить ее за вас, и чаще всего как раз ссылками на статьи, сайты и мануалы. Не ленитесь учиться! Толку не будет вам лично от того, что кто-то сделает за вас вашу работу, нужно ведь чтоб и в голове что-то осталось ;)
 
Отлично! Зайти на форум за помощью, чтоб тебе сказали там жe "Книжки пoчитать" :D
Не стоило тогда и отвечать.
Ну короче если Ender человек не знающий, то тут вам спрашивать не стоит, и наверное уже надо подавать резюме в гугл, хп, интел или каноникал, а я мирно уполз, размышляя откуда появляется:

"как программисты выносят мусор

5. программист на Delphi/C Builder
Ищет в интернете компонент выноса мусора. Если не находит, пытается вынести мусор своими силами, но
по пути рассыпает половину, а другую высыпает мимо контейнера. По дороге домой теряет ведро и тапки.
"
 

byterus

Ословед
Награды
4
Как отобразить скорость загрузки и размер файла в TLabel.
Загрузка файла производится с пoмoщью TidHTTP.

Как-то приходилось отображать прогрес закачки файла, использовал этот код:

Узнать размер файла - функция GetUrlSize:
Код:
uses
  WinInet;

function GetUrlSize(const URL: string): integer;
var
  hSession, hFile: hInternet;
  dwBuffer: array[1..20] of char;
  dwBufferLen, dwIndex: DWORD;
begin
  Result := 0;
  hSession := InternetOpen('GetUrlSize', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(hSession) then
  begin
    hFile := InternetOpenURL(hSession, PChar(URL), nil, 0, INTERNET_FLAG_RELOAD, 0);
    dwIndex := 0;
    dwBufferLen := 20;
    FillMemory(@dwBuffer, dwBufferLen, 0);
    if HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH, @dwBuffer, dwBufferLen, dwIndex) then
      Result := StrToInt(dwBuffer);
    if Assigned(hFile) then
      InternetCloseHandle(hFile);
    InternetCloseHandle(hsession);
  end;
end;

Сколько передано данных - Садимся на обработчик TIdHTTP.OnWork:
Код:
procedure TForm1.HttpWorkHandler(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
  if AWorkMode = wmRead then
    {Высчитываем время, в AWorkCount находится сколько уже скачалось байт}
end;
 

    Belpeer

    очки: 17
    Тo чтo надo, спасибo!
Награды
2
Не, парни, ну а как вы хотите? Чтобы пусть даже знающий человек тратил свое личное время на то, чтобы разжевать и вбить в голову начинающего (далеко не всегда умного, сообразительного и легко схватывающего умные мысли) всё по специфике заданного вопроса, а то еще и код готовый написал?
Обычно требуется написать 2-3 предложение или строчек 10 кода. Для знающего человека ахренеть какая миссия непосильная. Ну а если банально лень, то можно просто не посещать такие темы, никто ведь не заставляет.
 

byterus

Ословед
Награды
4
Быстро глянул... это для какой версии Indy? В Indy 10 его уже нет. Или наоборот что-то уже совсем новенькое?
Код и правда взят с девятой версии. Сейчас посмотрел в десятке - по крайней мере в 10.5.7 этот обработчик присутствует:yes:
 
Награды
7
Мне аж самому интересно стало. Я бы не стал использовать GetUrlSize, т.к. TIdHTTP сам выдает информацию по размеру ресурса. Попробовал тут накидать на будущее, авось понадобится.

Программа требует три параметра, один опциональный. Из дампа видно как из использовать.

Код:
C:\Users\Ender\Documents\RAD Studio\Projects\Samples\wget\bin\Debug\Win32>simplewget -url [URL]http://www.sqlmaestro.com/files/oracle_maestro_setup.exe[/URL] -target C:\Temp\oracle_maestro_setup.exe -verbose

Downloading URL: [URL]http://www.sqlmaestro.com/files/oracle_maestro_setup.exe[/URL]. Start time: 05/03/2011 10:21:44.
Downloaded    3636821 /   17015734 (21.37%). Start time: 05/03/2011 10:21:44. Expected finish time: 05/03/2011 10:21:58.
Downloaded    6880853 /   17015734 (40.44%). Start time: 05/03/2011 10:21:44. Expected finish time: 05/03/2011 10:21:59.
Downloaded    9829973 /   17015734 (57.77%). Start time: 05/03/2011 10:21:44. Expected finish time: 05/03/2011 10:22:00.
Downloaded   14122581 /   17015734 (83.00%). Start time: 05/03/2011 10:21:44. Expected finish time: 05/03/2011 10:21:59.
Downloaded   17015734 /   17015734 (100.00%). Start time: 05/03/2011 10:21:44. Expected finish time: 05/03/2011 10:22:03.
URL has been downloaded: [URL]http://www.sqlmaestro.com/files/oracle_maestro_setup.exe[/URL]. Size:   17015734.
Собственно программа. Особо не тестировал, вроде качает, инфу выводит.

Код:
program simplewget;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Classes,
  IdException,
  uURLDownloader in 'uURLDownloader.pas';

const
  kecNoURL=1;
  kecNoTarget=2;
  kecDownloadError=3;
  kecUnexpectedError=4;

  kURL='url';
  kTarget='target';
  kVerbose='verbose';

resourcestring
  kerrNoURL='URL is not specified.';
  kerrNoTarget='Target file name is not specified.';

type
  EWGetError=class(Exception);
  EWGetParameterError=class(EWGetError);
  EWGetNoURL=class(EWGetParameterError);
  EWGetNoTarget=class(EWGetParameterError);

function GetDownloadURL:string;
begin
  if not FindCmdLineSwitch(kURL, Result, True, [clstValueNextParam]) then
    Result:='';
end;

function GetTargetFileName:string;
begin
  if not FindCmdLineSwitch(kTarget, Result, True, [clstValueNextParam]) then
    Result:='';
end;

function GetVerbose:Boolean;
begin
  Result:=FindCmdLineSwitch(kVerbose, True);
end;

var
  SourceURL, TargetFileName:string;
  Verbose:Boolean;
  TargetStream:TStream;
  Downloader:TCustomURLDownloader;
  DisplayIndicator:TProgressDisplayIndicator;

begin
  try

    SourceURL:=GetDownloadURL;
    if SourceURL='' then
      raise EWGetNoURL.Create(kerrNoURL);
    TargetFileName:=GetTargetFileName;
    if TargetFileName='' then
      raise EWGetNoTarget.Create(kerrNoTarget);
    Verbose:=GetVerbose;

    TargetStream:=TFileStream.Create(TargetFileName, fmCreate or fmShareDenyWrite);
    try
      if Verbose then
        DisplayIndicator:=TConsoleDisplayIndicator.Create(2);
      try
        Downloader:=TIndyURLDownloader.Create(SourceURL, TargetStream, DisplayIndicator);
        try
          Downloader.Download;
        finally
          FreeAndNil(Downloader);
        end;
      finally
        FreeAndNil(DisplayIndicator);
      end;
    finally
      FreeAndNil(TargetStream);
    end;
  except
    on EWGetNoURL do
    begin
      WriteLn(kerrNoURL);
      ExitCode:=kecNoURL;
    end;
    on EWGetNoTarget do
    begin
      WriteLn(kerrNoTarget);
      ExitCode:=kecNoTarget;
    end;
    on E:EIdException do
    begin
      WriteLn(E.ClassName, ': ', E.Message);
      ExitCode:=kecDownloadError;
    end;
    on E: Exception do
    begin
      Writeln(E.ClassName, ': ', E.Message);
      ExitCode:=kecUnexpectedError;
    end;
  end;
end.
Модуль
uURLDownloader.pas

Код:
unit uURLDownloader;
interface
uses
  SysUtils,
  Classes,
  IdComponent,
  IdHTTP;

type

  TProgressDisplayIndicator=class(TObject)
  public
    procedure Display(const aURL:string; const aWorkDone, aTotalWork: Int64; const aWorkStarted:TDateTime); virtual; abstract;
    procedure DisplayEnd(const aURL:string; const aTotalWork: Int64; const aWorkStarted:TDateTime); virtual; abstract;
  end;

  TConsoleDisplayIndicator=class(TProgressDisplayIndicator)
  strict private
    FLastDisplayTime:TDateTime;
    FDisplayIntervalSeconds:Integer;
  strict protected
    property LastDisplayTime:TDateTime read FLastDisplayTime write FLastDisplayTime;
    property DisplayIntervalSeconds:Integer read FDisplayIntervalSeconds;
  public
    constructor Create(const aDisplayIntervalSeconds:Integer);
    procedure Display(const aURL:string; const aWorkDone, aTotalWork: Int64; const aWorkStarted:TDateTime); override;
    procedure DisplayEnd(const aURL:string; const aTotalWork: Int64; const aWorkStarted:TDateTime); override;
  end;

  TCustomURLDownloader=class(TObject)
  strict private
    FURL:string;
    FTarget:TStream;
    FDisplayIndicator:TProgressDisplayIndicator;
  strict protected
    procedure DisplayProgress(const aURL:string; const aWorkDone, aTotalWork: Int64; const aWorkStarted:TDateTime);
    procedure DisplayEnd(const aURL:string; const aTotalWork: Int64; const aWorkStarted:TDateTime);
    property URL:string read FURL;
    property Target:TStream read FTarget;
    property DisplayIndicator:TProgressDisplayIndicator read FDisplayIndicator;
  public
    constructor Create(const aURL:string; const aTarget:TStream; const aDisplayIndicator:TProgressDisplayIndicator);

    procedure Download; virtual; abstract;
  end;

  TIndyURLDownloader=class(TCustomURLDownloader)
  strict private
    FWorkStarted: TDateTime;
    FTotalWorkCount: Integer;
    FTotalWorkDone: Integer;
  private
  strict protected
    function GetURLFromSender(const aSender:TObject):string;

    procedure HTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
    procedure HTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
    procedure HTTPWorkEnd(ASender: TObject; AWorkMode: TWorkMode);

    property TotalWorkCount:Integer read FTotalWorkCount write FTotalWorkCount;
    property WorkDone:Integer read FTotalWorkDone write FTotalWorkDone;
    property WorkStarted:TDateTime read FWorkStarted write FWorkStarted;
  public
    procedure Download; override;
  end;

implementation
uses
  DateUtils;

resourcestring
  kNA='N/A';
  klogDownloadedSimple='Downloaded bytes: %d. Start time: %s.';
  klogDownloadedFull='Downloaded %10d / %10d (%5.2f%%). Start time: %s. Expected finish time: %s.';
  klogDownloadInfo='Downloading URL: %s. Start time: %s.';
  klogDownloadFinish='URL has been downloaded: %s. Size: %10d.';

{ TConsoleDisplayIndicator }

constructor TConsoleDisplayIndicator.Create(const aDisplayIntervalSeconds: Integer);
begin
  inherited Create;
  FDisplayIntervalSeconds:=aDisplayIntervalSeconds;
end;

procedure TConsoleDisplayIndicator.Display(const aURL:string; const aWorkDone, aTotalWork: Int64; const aWorkStarted: TDateTime);
var
  CurrentTime, ExpectedFinishTime:TDateTime;
  Speed, PercentDone:Double;
  Duration, RequiredDuration:Int64;
  ProgressMessage:string;
begin
  CurrentTime:=Now;
  if SecondsBetween(CurrentTime, LastDisplayTime)>DisplayIntervalSeconds then
  begin
    Duration:=MillisecondsBetween(CurrentTime, aWorkStarted);
    if Duration>0 then
    begin
      if aTotalWork>0 then
      begin
        Speed:=aWorkDone/Duration;
        PercentDone:=aWorkDone/aTotalWork;
        RequiredDuration:=Round(aTotalWork/Speed);
        ExpectedFinishTime:=IncMilliSecond(aWorkStarted, RequiredDuration);
        ProgressMessage:=Format(klogDownloadedFull, [aWorkDone, aTotalWork, PercentDone*100, DateTimeToStr(aWorkStarted), DateTimeToStr(ExpectedFinishTime)]);
      end
      else
        ProgressMessage:=Format(klogDownloadedSimple, [aWorkDone, DateTimeToStr(aWorkStarted)]);
    end
    else
      ProgressMessage:=Format(klogDownloadInfo, [aURL, DateTimeToStr(aWorkStarted)]);
    WriteLn(ProgressMessage);
    LastDisplayTime:=Now;
  end;
end;

procedure TConsoleDisplayIndicator.DisplayEnd(const aURL: string; const aTotalWork: Int64; const aWorkStarted: TDateTime);
begin
  WriteLn(Format(klogDownloadFinish, [aURL, aTotalWork]));
end;

{ TURLDownloader }

constructor TCustomURLDownloader.Create(const aURL: string; const aTarget: TStream; const aDisplayIndicator:TProgressDisplayIndicator);
begin
  inherited Create;
  Assert(aURL<>'', 'aURL is empty');
  FURL:=aURL;
  Assert(aTarget<>nil, 'aTarget is nil');
  FTarget:=aTarget;
  FDisplayIndicator:=aDisplayIndicator;
end;

{ TIndyURLDownloader }

procedure TIndyURLDownloader.Download;
var
  HTTP:TIdHTTP;
begin
  HTTP:=TIdHTTP.Create(nil);
  try
    WorkDone:=0;
    TotalWorkCount:=0;
    WorkStarted:=Now;
    HTTP.OnWork:=HTTPWork;
    HTTP.OnWorkBegin:=HTTPWorkBegin;
    HTTP.OnWorkEnd:=HTTPWorkEnd;
    HTTP.Get(URL, Target);
  finally
    FreeAndNil(HTTP);
  end;
end;

function TIndyURLDownloader.GetURLFromSender(const aSender: TObject): string;
var
  CustomHTTP:TIdCustomHTTP;
begin
  if aSender is TIdCustomHTTP then
  begin
    CustomHTTP:=aSender as TIdCustomHTTP;
    Result:=CustomHTTP.URL.GetFullURI;
  end
  else
    Result:='';
end;

procedure TIndyURLDownloader.HTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
begin
  if AWorkMode=wmRead then
  begin
    WorkDone:=AWorkCount;
    DisplayProgress(GetURLFromSender(ASender), WorkDone, TotalWorkCount, WorkStarted);
  end;
end;

procedure TIndyURLDownloader.HTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
begin
  if AWorkMode=wmRead then
  begin
    TotalWorkCount:=AWorkCountMax;
    WorkStarted:=Now;
    WorkDone:=0;
    DisplayProgress(GetURLFromSender(ASender), WorkDone, TotalWorkCount, WorkStarted);
  end;
end;

procedure TIndyURLDownloader.HTTPWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  if AWorkMode=wmRead then
  begin
    WorkDone:=TotalWorkCount;
    DisplayEnd(GetURLFromSender(ASender), TotalWorkCount, WorkStarted);
  end;
end;

procedure TCustomURLDownloader.DisplayEnd(const aURL: string; const aTotalWork: Int64; const aWorkStarted: TDateTime);
begin
  if DisplayIndicator<>nil then
    DisplayIndicator.DisplayEnd(aURL, aTotalWork, aWorkStarted);
end;

procedure TCustomURLDownloader.DisplayProgress(const aURL:string; const aWorkDone, aTotalWork: Int64; const aWorkStarted: TDateTime);
begin
  if DisplayIndicator<>nil then
    DisplayIndicator.Display(aURL, aWorkDone, aTotalWork, aWorkStarted);
end;

end.

Обращаю ваше внимание господа Fulmar & Jonny. На прочтение соответствующего отрывка документации и написание законченой программы ушло меньше 2-ух часов. Про программирование на компонентах Indy я знал не больше чем Fulmar. А вы вместо того чтобы читать документацию и изучать Indy предпочли сраться два дня на форуме.

Спасибо byterus-у за намёк на более простой вариант решения чем у меня.
 
Просьба модератора добавить в топ оригинал
краткая версия
выдержка:
Как интерпретировать ответы
RTFM и STFW: как понять, что вы серьезно облажались

Есть древняя и священная традиция: если вы получаете ответ "RTFM", значит, отвечающий думает, что вам стоит почитать руководство (Read The Fucking Manual). Он почти наверняка прав. Читайте.

У ответа RTFM есть более молодой аналог. Если вы получаете ответ "STFW", значит, отвечающий думает, что вам стоит поискать ответ в сети (Search The Fucking Web). Он почти наверняка прав. Ищите.

Часто тот, кто посылает один из подобных ответов, имеет под рукой руководство или web-страницу с необходимой вам информацией, и смотрит на нее, когда набирает ответ. Эти ответы означают, что, по его мнению, во-первых, необходимую вам информацию легко найти и, во-вторых, вы большему научитесь при поиске информации, чем если вам ее преподнесут под нос на тарелочке.

Вас это не должно возмущать; по хакерским стандартам, он оказал вам достаточное уважение уже тем, что не проигнорировал вопрос. Вы должны поблагодарить ответившего за его отеческую доброту.
Если вы не поняли...

Если вы не поняли ответ, не шлите тут же требование его объяснить. Используйте те же источники информации, что и при поиске ответа на исходный вопрос (руководства, ЧаВО, Web, опытные коллеги), чтобы понять ответ. Если и после этого вам необходимы разъяснения, покажите, что вы узнали сами.
Реакция на грубость

Большая часть того, что может показаться грубостью, в хакерских кругах используется не для оскорбления. Это, скорее, следствие непосредственного, без обиняков, стиля общения, естественного для людей, старающихся решать проблемы, а не казаться другим мягкими и пушистыми.

С другой стороны, иногда можно встретиться с грубостью и вызовом, не имеющими никаких видимых оснований. Обратная сторона этой медали в том, что такая реакция является вполне приемлемой формой постановки на место действительных грубиянов, - мы отсекаем их недостойное поведение остро отточенным словесным скальпелем. Однако, вы должны быть очень уверены в своей позиции, прежде чем пытаться этим заняться (Заточите скальпель ;) - Ktirf). Грань между указанием на невежливость и началом бессмысленного флейма настолько тонкая, что и сами хакеры нередко ее переходят. Если вы - новичок или просто случайный читатель, шансов избежать такой грубой ошибки - немного. Если вас интересует информация, а не развлечение, лучше уберите руки с клавиатуры и не рискуйте вступать в подобные дискуссии.
Не реагируйте как неудачник

Вполне вероятно, что вы уже облажались несколько раз в хакерских форумах так, как описано в этой статье, или аналогично. И вам уже объяснили, как именно вы облажались, возможно, в красках. При всем честном народе.

Когда такое происходит, самая неудачная реакция - жаловаться на случившееся, считать себя оскорбленным словесно, требовать извинений, вопить, задыхаться от гнева, подавать иски в суд, жаловаться работодателям обидчиков, не опускать за собой сидения унитаза и т.п. Вместо всего этого надо сделать следующее:

Смириться. Это - нормально. На самом деле, это хорошо и целесообразно.

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

Q: Где можно найти программу или ресурс X?
A: Там же, где и я ее взял, придурок,- найти в Internet. Боже, неужели еще не все знают, как пользоваться Google?

Q: Моя {программа, конфигурация, мой оператор SQL} не работает.
A: Это вообще не вопрос, и я не собираюсь задавать еще десяток наводящих вопросов, чтобы выяснить, в чем на самом деле состоит ваша проблема - у меня есть дела и поинтереснее. Когда я вижу подобные вопросы, то обычно посылаю один из следующих ответов:
Вам к этому больше нечего добавить?
Ой, это очень плохо. Надеюсь, вы уже это исправили.
И какое это имеет отношение лично ко мне?
Хорошие и плохие вопросы

Глупо: Где мне найти информацию о Foonly Flurbamatic?
Этот вопрос просто напрашивается на ответ "STFW".

Правильно: Я попытался поискать в Web с помощью Google по запросу "Foonly Flurbamatic 2600", но полезных ссылок не получил. Не знает ли кто-нибудь, где найти информацию о программировании этого устройства?
Этот вопрошающий уже поискал в Web и, похоже, у него - реальная проблема.

Глупо: Я не могу скомпилировать код проекта foo. Почему он некорректен?
Он думает, что кто-то другой облажался. Самоуверенный тип.

Правильно: Код проекта foo не компилируется в ОС Nulix версии 6.2. Я прочитал ЧаВО (FAQ), но там нет ничего о проблемах с Nulix. Вот запись сеанса компиляции; что я сделал неправильно?
Он указал среду, прочитал часто задаваемые вопросы, показал сообщение об ошибке, и он не думает, что причина его проблемы в ошибке кого-то другого. Этому парню можно уделить немного внимания.
тут для тех у кого вдруг инета нет, но выпилена до 10к символов
 

    Trogvar

    очки: 39
    за Джобса ... в дневнике

Alex Kop

Выживший
Награды
7
ребят, помогите пжл с заданием по Паскалю
Правило формирования "вечного календаря"
Установлено: если исследуемая дата лежит в диапазоне от 1582 до 4902 гг., то номер дня недели (воскресенье – 0, понедельник – 1, …, суббота – 6) равен остатку от деления на 7 значения выражения:
[2.6m-0.2]+d+y+[y/4]+[c/4]-2c,
где d - номер дня в месяце (1,2,…); m - номер месяца в году, нумерация начинается с марта (март - 1, апрель - 2, .., декабрь - 10, январь и февраль имеют номера 11 и 12 предыдущего года); y - две младшие цифры года; c - две старшие цифры года, [x] - целая часть x.
При этом, если остаток от деления получается меньше нуля, то к нему надо прибавить 7.
При решении задачи обязательно использовать диапазонный или перечисляемый типы данных.
Учитывая правило формирования "вечного календаря" определить день недели, на который падает введенная пользователем дата.

Составить программу печати по одному разу в алфавитном порядке всех строчных русских гласных букв, входящих в заданный текст.
(Программа должна быть решена с использованием множественных типов данных.)
Желательно с комментарий, ну чтоб на будущее было понятно, что да как.
Заранее очень, очень благодарен.;)
 
Всем вечер добрый!Вообще есть еще всякого рода документация а-ля Winapi и др. Если кому читать лень-он лентяй.За спасибо я думаю напрягатся никто не хочет .
 

Grunger

Ословед
Награды
6
Никто не пытался написать игра моджонг на паскале? Или может находил исходники в инете?
 

MIDAS

Ословед
В подготовке к уч году сел за делфи. Суть проекта в следующем: простенький текстовый редактор. Все функции какие хотел вроде реализовал. Проблема только с ToolBar'ом.
Что нужно: чтобы на кнопках отображались иконки.
Что делаю:
1) разместил тулбар. на нём сделал 10 кнопок. Каждая со своей функцией (копировать вставить, открыть, закрыть итд) Формат кнопок 32х32
2) Кнопки соединил с пунктами MainMenu (код писал именно для пунктов, а не для кнопок)
3) разместил ImageList. Туда добавил 10 картинок png формата 16х16
4)В свойстве тулбара Images указал свой имейджлист1. В свойствах кнопок на тулбаре ImageIndex указал нужные индексы картинок (0....9 соответственно)
На самой форме в делфи иконки появились на кнопках. Но когда ждму F9 кнопки пусты. Функции есть, а вот самих картинок нет...
Вопрос: что делаю не так?

Также ещё два вопроса: как можно добавить горячие клавиши к пунктам MainMenu? Как добавить картинки к пунктам MainMenu и PopupMenu?
 

HELL BOOMER

Ословед
В подготовке к уч году сел за делфи. Суть проекта в следующем: простенький текстовый редактор. Все функции какие хотел вроде реализовал. Проблема только с ToolBar'ом.
Что нужно: чтобы на кнопках отображались иконки.
Что делаю:
1) разместил тулбар. на нём сделал 10 кнопок. Каждая со своей функцией (копировать вставить, открыть, закрыть итд) Формат кнопок 32х32
2) Кнопки соединил с пунктами MainMenu (код писал именно для пунктов, а не для кнопок)
3) разместил ImageList. Туда добавил 10 картинок png формата 16х16
4)В свойстве тулбара Images указал свой имейджлист1. В свойствах кнопок на тулбаре ImageIndex указал нужные индексы картинок (0....9 соответственно)
На самой форме в делфи иконки появились на кнопках. Но когда ждму F9 кнопки пусты. Функции есть, а вот самих картинок нет...
Вопрос: что делаю не так?

Также ещё два вопроса: как можно добавить горячие клавиши к пунктам MainMenu? Как добавить картинки к пунктам MainMenu и PopupMenu?

1) Как ты засунул в ImageList png, если он поддерживает только ico и bmp? (засунь bmp и проверь);
2) Свойство ShortCut, Images и ImageIndex (как и в ToolBar'е).
 

    MIDAS

    очки: 55
    Спасибо. Поковырялся - разобрался.

MIDAS

Ословед
1) результат тот же. На форме на кнопках отображается картинка, когда запускаю - то картинки нет. К вопросу о том как засунул png - это не ко мне, это к делфи)) Может 2010 способен их засовывать?
2)Спасибо, разобрался. А по - поводу картинок к этим всем пунктам менюшек можешь подсказать?


UPD: методом тыка установил что картинку надо было приделывать тоже не к кнопке, а к меню. Там оказывается тоже есть аналогичные свойства.
 
Награды
7
1) результат тот же. На форме на кнопках отображается картинка, когда запускаю - то картинки нет. К вопросу о том как засунул png - это не ко мне, это к делфи)) Может 2010 способен их засовывать?
2)Спасибо, разобрался. А по - поводу картинок к этим всем пунктам менюшек можешь подсказать? UPD: методом тыка установил что картинку надо было приделывать тоже не к кнопке, а к меню. Там оказывается тоже есть аналогичные свойства.
Самое правильное - создать набор action-ов, на них назначить и обработку, и картинки, и надписи, и shortcut-ы, а уже потом пунктам меню и кнопкам на тулбаре назначать эти экшны.
 
MIDAS, может у тебя картинки и не отображаются, что они в PNG? Засейвь в битмап (*.bmp). Не долго ведь..
 
Сверху