Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 15.01.2015
Сообщений: 42
1

Панель быстрого запуска, буфер обмена, путь до ресурсов и Ini

22.03.2015, 20:46. Показов 2136. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, уважаемые. Рылся, рылся по форумам не нарыл ни чего и только запутался еще больше.
Делаем панель быстрого запуска. Создаем глобальную переменную, запускаем при открытии формы DragAcceptFiles(handle, true) (разрешаем Drag and Dron). Создаем процедуру перетягивания ярлыка приложения:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var
CFileName: array[0..MAX_PATH] of Char;
//...
procedure TForm2.WmDropFiles(var Msg: TWMDropFiles);
var
 iconindex: word;
 icon: hicon;
    begin
      F:=CfileName; 
      Label1.Caption:=ExtractFileName(F);
      Msg.Result:=0;
    DragFinish(Msg.Drop);
  iconindex:=1;
  Image1.Picture.Icon.Handle:= ExtractAssociatedIcon(HInstance, Pchar(F), iconIndex);
  DrawIcon(Canvas.Handle,10,10,icon);
  end;
Создаем Ini-шник, прописываем на открытие и закрытие формы сохранение и запись параметров, НО! Как сохранить путь до иконки, чтобы на следующее открытие остались данные о перетянутых иконках и пути к файлам? Банальное ReadString('option', 'linc1', F) толку не дает. И не дает толку ReadString('option', 'linc1', CFileName).
Формулирую полностью вопрос: Как сохранить путь до иконки, чтобы на следующее открытие остались данные о перетянутых иконках и пути к файлам? Желательно конкретно, ибо я новичек в плане программирования (только учусь). Установлен на компе ХЕ7 на Вин7*64 Про (если нужна эта инфа).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2015, 20:46
Ответы с готовыми решениями:

Вернуть панель быстрого запуска и языковую панель (как в XP)
Добрый вечер. Если я возвращаю панель быстрого запуска и языковую панель на панель задач, то после...

Панель быстрого запуска в Windows 7
Добрый день. до Win7 система позволяла добавлять ярлыки на панель задач. причем ярлыки не на...

Панель быстрого запуска Windows 7
Подскажите пожалуйста,что можно сделать чтобы панель быстрого запуска постоянно не исчезала?Из за...

Сделать из SideBar панель быстрого запуска
Хотелось бы, чтобы было так: работаешь в какой то приложеннии, надо запусть софтину, но не...

26
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
22.03.2015, 23:16 2
иконка никуда не сохраняется, она так в файле и лежит
так что сохраняем в ini имя этого файла, потом точно таким же способом как тут, достаем опять иконку

files.ini:
Код
[Files]
File1=C:\zzxx.exe
File2=D:\mmm.exe
File3=C:\11111.exe
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
uses iniFiles;
 
var Ini:TIniFile;
      L:TStringList;
 
 
L:=TStringList.Create;
try
  ini:=TIniFile.Create(extractFilePath(Paramstr(0)) + 'files.ini');
  ini.ReadSectionValues('Files',L);
  showMessage(l.values['File1']); /// C:\zzxx.exe
finally
  ini.free;
  l.free;
end;
Добавлено через 1 минуту
сохранение - аналогично
Заполняем StringList
L['File1']:=Filename1
...
L['FileN']=FilenameN

сохраняем
Delphi
1
ini.WriteSectionValues('Files',L);
1
0 / 0 / 0
Регистрация: 15.01.2015
Сообщений: 42
23.03.2015, 08:22  [ТС] 3
А можно про сохранение секции поподробнее? На закрытие формы прописываю
Delphi
1
2
3
begin
ini.WriteSectionValues('Files',L);
end;
Ругается, что неизвестно WriteSectionValues
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
23.03.2015, 12:06 4
Цитата Сообщение от ventura69 Посмотреть сообщение
Ругается, что неизвестно WriteSectionValues
а откуда ты взял этот метод?

Добавлено через 1 минуту
ты хоть бы для приличия заглянул в класс и поискал там этот метод
Delphi
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
TCustomIniFile = class(TObject)
  private
    FFileName: string;
  protected
    const SectionNameSeparator: string = '\';
    procedure InternalReadSections(const Section: string; Strings: TStrings;
      SubSectionNamesOnly, Recurse: Boolean); virtual;
  public
    constructor Create(const FileName: string);
    function SectionExists(const Section: string): Boolean;
    function ReadString(const Section, Ident, Default: string): string; virtual; abstract;
    procedure WriteString(const Section, Ident, Value: String); virtual; abstract;
    function ReadInteger(const Section, Ident: string; Default: Longint): Longint; virtual;
    procedure WriteInteger(const Section, Ident: string; Value: Longint); virtual;
    function ReadBool(const Section, Ident: string; Default: Boolean): Boolean; virtual;
    procedure WriteBool(const Section, Ident: string; Value: Boolean); virtual;
    function ReadBinaryStream(const Section, Name: string; Value: TStream): Integer; virtual;
    function ReadDate(const Section, Name: string; Default: TDateTime): TDateTime; virtual;
    function ReadDateTime(const Section, Name: string; Default: TDateTime): TDateTime; virtual;
    function ReadFloat(const Section, Name: string; Default: Double): Double; virtual;
    function ReadTime(const Section, Name: string; Default: TDateTime): TDateTime; virtual;
    procedure WriteBinaryStream(const Section, Name: string; Value: TStream); virtual;
    procedure WriteDate(const Section, Name: string; Value: TDateTime); virtual;
    procedure WriteDateTime(const Section, Name: string; Value: TDateTime); virtual;
    procedure WriteFloat(const Section, Name: string; Value: Double); virtual;
    procedure WriteTime(const Section, Name: string; Value: TDateTime); virtual;
    procedure ReadSection(const Section: string; Strings: TStrings); virtual; abstract;
    procedure ReadSections(Strings: TStrings); overload; virtual; abstract;
    procedure ReadSections(const Section: string; Strings: TStrings); overload; virtual;
    procedure ReadSubSections(const Section: string; Strings: TStrings; Recurse: Boolean = False); virtual;
    procedure ReadSectionValues(const Section: string; Strings: TStrings); virtual; abstract;
    procedure EraseSection(const Section: string); virtual; abstract;
    procedure DeleteKey(const Section, Ident: String); virtual; abstract;
    procedure UpdateFile; virtual; abstract;
    function ValueExists(const Section, Ident: string): Boolean; virtual;
    property FileName: string read FFileName;
  end;
0
0 / 0 / 0
Регистрация: 15.01.2015
Сообщений: 42
23.03.2015, 12:27  [ТС] 5
Цитата Сообщение от DenNik Посмотреть сообщение
а откуда ты взял этот метод?

Добавлено через 1 минуту
ты хоть бы для приличия заглянул в класс и поискал там этот метод
Я и почитал. И не нашел, и не понял. Потому и прошу помощи в понятной мне форме. Можете подсказать, объяснить, дать полный пример, чтобы я разобрался? Если да, то - моя огромная благодарность Вам, в противном случае - не стоит (я думаю) загромождать форум перлами своей мудрости (попросту: пустословием)!
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
23.03.2015, 13:36 6
гут
сорри, забыл что обратного метода писать пачкой нет

вот пример
проверил
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 L:=TStringList.Create;
  ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'config.ini');
  ini.ReadSectionValues('Files',L);
  for i := 0 to L.Count-1 do
    l[i]:=l.ValueFromIndex[i];
  ini.free;
  L.Free;
 
  L:=TStringList.Create;
  L.Add('nnn.txt');
  L.Add('mmm.eee');
  ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'config.ini');
  ini.EraseSection('Files');
  for i := 0 to L.Count-1 do
    ini.writestring('Files','File'+Inttostr(i+1), l[i]);
  ini.free;
  L.Free;
1
0 / 0 / 0
Регистрация: 15.01.2015
Сообщений: 42
23.03.2015, 16:17  [ТС] 7
Брр... А у меня опять не мурмулит. То есть на закрытие формы создает линки в инишнике, но на открытие формы теряет все записи. Вот полный кусок цикла. Гляньте, пожалуйста, где я накосячил.
В спойлер залезать не захотело, к сожалению.
Delphi
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
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ShellApi, Vcl.StdCtrls, Vcl.ExtCtrls, iniFiles;
 
type
  TForm1 = class(TForm)
    Image1: TImage;
    Label1: TLabel;
    procedure OnCreate(Sender: TObject);
    procedure OnClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    procedure WmDropFiles( var Msg: TWMDropFiles); message WM_DropFiles;
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  CFileName: array[0..MAX_PATH] of Char; // Переменная с именем перетаскиваемого файла
   F: string;     //переменная для работы с ляблой
   i:integer;     //переменная для работы инишника
  Ini:TIniFile;  //подключаем создание инишника
  L:TStringList; // переменная строк
implementation
 
{$R *.dfm}
 
{ TForm1 }
 
procedure TForm1.OnClose(Sender: TObject; var Action: TCloseAction); //закрытие формы
begin
 L:=TStringList.Create;   //создаем лист
  L.Add(CFileName);      // добавляем строку о пути к файлу, для которого выводим ярлык
  ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'config.ini');  //создаем тело, положение и имя инишника
  ini.EraseSection('Files');                         //Удаляем заглавие из инишника
  for i := 0 to L.Count-1 do                       //создаем строку под данные
    ini.writestring('Files','File'+Inttostr(i+1), l[i]);  //записываем строку с путем до файла
  ini.free;                                                       //очищаем
  L.Free;                                                      
end;
 
procedure TForm1.OnCreate(Sender: TObject);         //создание формы
begin
 
L:=TStringList.Create;                    //аналогично верхнему блоку
 ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'config.ini');  
  ini.ReadSectionValues('Files',L);       //записываем из секции Files строку 
  for i := 0 to L.Count-1 do
    l[i]:=l.ValueFromIndex[i];
  ini.free;                                   //освобождаем процесс
  L.Free;
 DragAcceptFiles(handle, true); // Включаем режим Drag-and-drop
end;
 
procedure TForm1.WmDropFiles(var Msg: TWMDropFiles);      //процедура драг/дроп на форму
var
  icon: hicon; //Иконка файла
  iconindex: word;
begin
    if DragQueryFile(Msg.Drop,0, CfileName, Max_Path)> 0 then //Если перетащили файл
    begin
      F:=CfileName; // Конвертируем Array of Char -> String
      Label1.Caption:=ExtractFileName(F); // Получаем имя файла из его полного пути
      iconindex:=1;
  Image1.Picture.Icon.Handle:= ExtractAssociatedIcon(HInstance, Pchar(F), iconIndex);  //получаем путь до файла
  DrawIcon(Canvas.Handle,10,10,icon); //Рисуем картинку
  DragFinish(Msg.Drop); //Говорим что приняли файл
   end
   else                     //если файл не перетащили, то
  begin 
      F:=CfileName; // Конвертируем Array of Char -> String
      Label1.Caption:=ExtractFileName(F); // Получаем имя файла из его полного пути
      iconindex:=1;
  Image1.Picture.Icon.Handle:= ExtractAssociatedIcon(HInstance, Pchar(F), iconIndex);
  DrawIcon(Canvas.Handle,10,10,icon); //Рисуем картинку
  end;
 
 
end;
 
end.
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
23.03.2015, 16:23 8
Цитата Сообщение от ventura69 Посмотреть сообщение
В спойлер залезать не захотело, к сожалению.
значит неправильно делал
[SPOILER][DELPHI]тут код[/DELPHI][/SPOILER]

Добавлено через 1 минуту
две кнопки нажимаешь - сначала спойлер, потом delphi. все само напишется
0
0 / 0 / 0
Регистрация: 15.01.2015
Сообщений: 42
23.03.2015, 16:31  [ТС] 9
Так и сделал, но спойлер не разворачивался, потому спойлер убрал.
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
23.03.2015, 16:35 10
Цитата Сообщение от ventura69 Посмотреть сообщение
но спойлер не разворачивался,
а это глюк сайта. нужно обновить страницу, и все заработает. у меня постоянно это случается
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
23.03.2015, 16:50 11
глобальные переменные лучше использовать для глобальных целей
когда работа Создал-Выполнил-Стер, нужно использовать локальные

приведенный код работает, конечно
но куда мы деваем полученные значения L ?
сейчас вот что:
создали L
прочитали L
стерли L
0
Заблокирован
23.03.2015, 18:20 12
Цитата Сообщение от krapotkin Посмотреть сообщение
глобальные переменные лучше использовать для глобальных целей
когда работа Создал-Выполнил-Стер, нужно использовать локальные
советую тебе давать функции, сделанные максимально автономно. тогда и не будет возникать
Цитата Сообщение от ventura69 Посмотреть сообщение
Брр... А у меня опять не мурмулит.
вопросы-то, сам знаешь, кто тут задаёт.
0
0 / 0 / 0
Регистрация: 15.01.2015
Сообщений: 42
23.03.2015, 19:27  [ТС] 13
Ну, не такой уж я и деревянный :-) Последний совет навел на мысль. Сейчас проверяю - кажется понял свою ошибку. Если получится: отпишусь с глубочайшим признанием, а если не получится: снова начну просить помощи... :-)

Добавлено через 1 час 3 минуты
Цитата Сообщение от krapotkin Посмотреть сообщение
глобальные переменные лучше использовать для глобальных целей
когда работа Создал-Выполнил-Стер, нужно использовать локальные

приведенный код работает, конечно
но куда мы деваем полученные значения L ?
сейчас вот что:
создали L
прочитали L
стерли L
Все же я деревянный... Изменил переменные на локальные, на открытие формы, после считывания L добавил сразу создание по переменной изображения, результат тот же. Нулевой. Косяк в моей конструкции где-то, а где - не могу понять. Дадите еще пару подсказок?
0
Заблокирован
23.03.2015, 20:49 14
Цитата Сообщение от ventura69 Посмотреть сообщение
Дадите еще пару подсказок?
показывай.
0
0 / 0 / 0
Регистрация: 15.01.2015
Сообщений: 42
23.03.2015, 21:41  [ТС] 15
Цитата Сообщение от Verevkin Посмотреть сообщение
показывай.
А что показывать? Вот с этого поста никаким макаром не могу из инишника создать ярлык на форме при открытии. Код в посте приведен полностью...
0
Заблокирован
23.03.2015, 21:57 16
Цитата Сообщение от ventura69 Посмотреть сообщение
из инишника создать ярлык на форме при открытии
он для этого и не предназначен. а предназначен он для хранения информации. Так что формулируй задачу правильно, раздели её на независимые подпункты.
0
0 / 0 / 0
Регистрация: 15.01.2015
Сообщений: 42
23.03.2015, 22:25  [ТС] 17
Цитата Сообщение от Verevkin Посмотреть сообщение
он для этого и не предназначен. а предназначен он для хранения информации. Так что формулируй задачу правильно, раздели её на независимые подпункты.
То есть? И как выглядит правильно сформулированная задача?
В инишнике лежит путь к файлу, ярлык которого должен появиться при открытии формы на имадже. Если пути нет в инишнике, то ничего не показываем в имадже. При запуске формы я получаю путь в локальную переменную из инишника (проверял через месседж-боксы: путь прописывается и считывается из инишника), но при попытке внедрить этот путь в цепочку создания иконки на имадже ( при открытии формы считываю путь из ини, закладываю в переменную и тут же пытаюсь строить иконку) вся система рушится и не фурычит.
Где я туплю?
0
Заблокирован
23.03.2015, 22:40 18
Цитата Сообщение от ventura69 Посмотреть сообщение
То есть? И как выглядит правильно сформулированная задача?
В инишнике лежит путь к файлу, ярлык которого должен появиться при открытии формы на имадже. Если пути нет в инишнике, то ничего не показываем в имадже. При запуске формы я получаю путь в локальную переменную из инишника (проверял через месседж-боксы: путь прописывается и считывается из инишника), но при попытке внедрить этот путь в цепочку создания иконки на имадже ( при открытии формы считываю путь из ини, закладываю в переменную и тут же пытаюсь строить иконку) вся система рушится и не фурычит.
Где я туплю?
АААААААААА!!! не надо так, перестань! ты опять всё в кучу мешаешь.
попробуй вот такой способ формулировки:
1. научиться читать из ini и писать в ini список имён файлов, хранящихся в памяти моей программы; написать и отладить 2 соотв. функции с проверкой ошибок.
2. написать функцию загрузки картинки в TImage из файла, с проверкой ошибок. прототип:
Delphi
1
function ImageFromFile(const AFileName: string): boolean; // true в случае успеха
3. ...
4. ...
...
N. ...
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
23.03.2015, 22:56 19
если ты с того поста ничего не менял, то для чего тебе указывали на ошибки?
если менял, покажи, что теперь.

ГДЕ код, который, после считывания из ини, хоть где-то в программе сохраняет то, что прочитано?
"в том посте" после считывания списка файлов в L, L вообще уничтожается вместе со списком...
0
0 / 0 / 0
Регистрация: 15.01.2015
Сообщений: 42
24.03.2015, 11:31  [ТС] 20
Цитата Сообщение от krapotkin Посмотреть сообщение
если ты с того поста ничего не менял, то для чего тебе указывали на ошибки?
если менял, покажи, что теперь.

ГДЕ код, который, после считывания из ини, хоть где-то в программе сохраняет то, что прочитано?
"в том посте" после считывания списка файлов в L, L вообще уничтожается вместе со списком...
Уважаемый, не надо так нервничать! Это я должен нервничать из-за своей тупости.
После 6 подвешиваний системы моей дремучей тупостью получилось так:
На открытие формы пишем
Кликните здесь для просмотра всего текста
:
Подключаем модули IniFiles и ShellApi
глобальная переменная Settings: TINIFile;
Понеслось открытие формы
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm1.OnCreate(Sender: TObject);  //открываем форму
var
S: string; //локальная текстовая
icon: hicon; //Иконка файла
iconindex: word; //связь с внешним миром
begin
DragAcceptFiles(handle, true); // Включаем режим Drag-and-drop
Settings:=  TIniFile.Create(GetCurrentDir + '\config.ini');   // Создаем config.ini файл рядом с экзешником
F:= Settings.ReadString('Form', 'Linc', F); //считываем в переменную значение, ранее записанное в строку
if Length(F)>0 then      //если строка не нулевая, то
begin
showMessage(F); /// проверяем, что за путь у нас
Image1.Picture.Icon.Handle:= ExtractAssociatedIcon(HInstance, Pchar(F), iconIndex); //переводим строку в путь
  DrawIcon(Canvas.Handle,10,10,icon); //Рисуем картинку
  end;
end;                            //если путь пустой (первое создание ini), то выходим

На закрытие формы пишем:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
procedure TForm1.OnClose(Sender: TObject; var Action: TCloseAction);
begin
Settings.WriteString('Form', 'Linc', F); //забрасываем из глобальной переменной путь в ini
showMessage(F);                            // проверяем себя, какой путь у нас прописался
end;

Готов слушать критику и комментарии по более рациональной реализации

Добавлено через 2 минуты
Цитата Сообщение от Verevkin Посмотреть сообщение
АААААААААА!!! не надо так, перестань! ты опять всё в кучу мешаешь.
.
Проверьте, что получилось.
0
24.03.2015, 11:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2015, 11:31
Помогаю со студенческими работами здесь

Панель быстрого запуска сползает вправо
Создана Панель быстрого запуска, как она была в Виндовс ХР, но она не хочет размещаться на своем...

Где в Windows 7 панель быстрого запуска?
всем привет Где в этой семёрке панель быстрого запуска в хр она есть я туда все ярлыки со стола...

Внести свою программу на панель быстрого запуска
Доброго времени суток, хотелось бы узнать как можно закинуть программу на панель быстрого запуска, ...

Как добавить прогу в панель быстрого запуска?
как добавить прогу в панель быстрого запуска?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru