Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lazarus
Войти
Регистрация
Восстановить пароль
 
oleggrv
0 / 0 / 0
Регистрация: 15.05.2017
Сообщений: 2
1

Имя файла из строки ComboBox

15.05.2017, 20:22. Просмотров 339. Ответов 10
Метки нет (Все метки)

Добрый день. Являюсь студентом строительного ВУЗа. Преподаватель не в тему дал задание написать код в Delphi Lazarus.
Цель: текст из выбранной пользователем строки из ComboBox должен быть скопирован в ячейку открытого excel файла. После, excel файл, должен быть сохранен с именем из этой ячейки.
Исходный код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.Button1Click(Sender: TObject);
begin
Sheet:=E.WorkSheets.Item['List1'];
S1:=Sheet.Range['B6'];
E.ActiveWorkbook.SaveAs('D:\Downloads\Delphi_Lazarus\'+S1+'.xlsx');
E.Quit;
end;                
 
procedure TForm1.Button2Click(Sender: TObject);
begin
E.visible:=true;
E.Workbooks.open('D:\Downloads\Delphi_Lazarus\Delphi_Lazarus\lazarus\xlt\spf.xlsx' );
E.Range['D3']:=ComBoxOBJ.Items[ComBoxOBJ.ItemIndex];
end;
Пожалуйста, можете подсказать, как решить проблему.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2017, 20:22
Ответы с готовыми решениями:

Относительное имя файла
есть memo1 И ФАИЛ *.txt в мемо текст с файла загужается(H:\папка) но когда...

Отоброть имя файла из ссылки
Есть ссылка: http://www.google.com/intl/de/images/home_title.gif Как из неё...

Имя процесса по названию файла
Доброго времени суток. Не подскажите, как можно узнать имя процесса (как в...

Имя файла без полного пути
Вот такая беда procedure TForm1.MenuItem5Click(Sender: TObject);//загрузить...

Записать в имя файла его хеш
Здравствуйте! Нужна помощь. Когда то в делфи делал замену имени файла на хеш...

10
Joey
Форумчанин
943 / 564 / 220
Регистрация: 05.05.2015
Сообщений: 3,254
Записей в блоге: 2
15.05.2017, 22:43 2
Цитата Сообщение от oleggrv Посмотреть сообщение
написать код в Delphi Lazarus
Кто-то из Вас точно не прав)) На будущее - Lazarus - это точно не делфи. Это свободный проект, аналог Делфи, хотя и копирует делфи во многом

Цитата Сообщение от oleggrv Посмотреть сообщение
как решить проблему.
А в чем проблема? Код не работает? Или его переделать надо? Вроде в коде ошибок не видно на первый взгляд

Добавлено через 10 минут
Раз уж это все-таки Лазарус, то:
Лазарус работает с юникод-строками. Передавать их в Excel-приложение напрямую не есть правильно. Надо конвертировать:
Delphi
1
E.ActiveWorkbook.SaveAs(Widestring(UTF8ToSys('D:\Downloads\Delphi_Lazarus\'+S1+'.xlsx')));
и соответственно
Delphi
1
E.Workbooks.open(Widestring(UTF8ToSys('D:\Downloads\Delphi_Lazarus\Delphi_Lazarus\lazarus\xlt\spf.xlsx')));
В uses подключить LazUTF8
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26492 / 17792 / 7038
Регистрация: 22.10.2011
Сообщений: 31,310
Записей в блоге: 6
15.05.2017, 22:54 3
Цитата Сообщение от Joey Посмотреть сообщение
UTF8ToSys
В новых версиях не нужен, это заглушка:
Pascal
1
2
3
4
function UTF8ToSys(const s: string): string;
begin
  Result:=s;
end;
, достаточно привести к WideString
0
Joey
Форумчанин
943 / 564 / 220
Регистрация: 05.05.2015
Сообщений: 3,254
Записей в блоге: 2
15.05.2017, 23:02 4
Цитата Сообщение от volvo Посмотреть сообщение
достаточно привести к WideString
Вроде давно в курсе, но счас попробовал - не прокатило. Lazarus 1.6, MS Office 2010

Добавлено через 32 секунды
Что может быть причиной? вот с UTF8ToSys работает, даже расширение файла можно опустить

Добавлено через 2 минуты
volvo,
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.Button1Click(Sender: TObject);
var W: Variant;
begin
  W := CreateOLEObject('Excel.Application');
  W.Visible := true;
  //W.Workbooks.Open(Widestring(UTF8ToSys('D:\Лист Microsoft Excel.xlsx'))); // работает
  //W.Workbooks.Open(Widestring(UTF8ToSys('D:\Лист Microsoft Excel'))); // работает
  W.Workbooks.Open(Widestring('D:\Лист Microsoft Excel.xlsx')); // не работает
 
end;
В uses LazUTF8, LazFileUtils. Проект с нуля
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26492 / 17792 / 7038
Регистрация: 22.10.2011
Сообщений: 31,310
Записей в блоге: 6
15.05.2017, 23:11 5
Значит, Ctrl+Click по названию метода, и смотри, какая часть у тебя неактивна (то есть, с какими директивами собирался Лазарус). У меня выглядит вот так (Lazarus 1.6.4) :
0
Миниатюры
Имя файла из строки ComboBox  
Joey
Форумчанин
943 / 564 / 220
Регистрация: 05.05.2015
Сообщений: 3,254
Записей в блоге: 2
15.05.2017, 23:18 6
То же UTF8_RTL
Имя файла из строки ComboBox


Конечно, я по опыту чувствую, что я сам что-то сделал не так (до сих пор по Вашему наставлению работал напрямую через Widestring и все работало). Но вроде чистый проект, чистый Excel (редко запускаю)
0
Joey
Форумчанин
943 / 564 / 220
Регистрация: 05.05.2015
Сообщений: 3,254
Записей в блоге: 2
15.05.2017, 23:20 7
Ошибка:
0
Миниатюры
Имя файла из строки ComboBox  
droider
Universal
Эксперт Pascal/Delphi
4405 / 2451 / 765
Регистрация: 04.10.2012
Сообщений: 8,911
16.05.2017, 09:21 8
Joey, файл присутствует по данному пути?
0
Joey
Форумчанин
943 / 564 / 220
Регистрация: 05.05.2015
Сообщений: 3,254
Записей в блоге: 2
16.05.2017, 19:31 9
droider, да, я ж говорю
Delphi
1
2
W.Workbooks.Open(Widestring(UTF8ToSys('D:\Лист Microsoft Excel.xlsx')));
W.Workbooks.Open(Widestring(UTF8ToSys('D:\Лист Microsoft Excel')));
оба варианта работают. Знаете что, не обращайте внимания, я наверное что-то не так делаю и отнимаю ваше время, буду работать через UTF8ToSys по старинке. Да и ТС-а вон перекрыл своими постами
0
oleggrv
0 / 0 / 0
Регистрация: 15.05.2017
Сообщений: 2
16.05.2017, 20:40  [ТС] 10
Joey,
Да, код не работает. Сейчас попробовал ваш вариант, выдает ошибку "Проект вызвал класс исключения EVariant error" с сообщением :Invalid variant type cast".
Мой код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  comobj, Lazutf8, variants;  
 
procedure TForm1.Button1Click(Sender: TObject);
var Sheet: Variant;
   S1: String;
begin
Sheet:=E.WorkSheets.Item['List1'];
S1:=Sheet.Range['B6'];
E.ActiveWorkbook.SaveAs(Widestring(UTF8toSys('D:\Downloads\Delphi_Lazarus\'+S1+'.xlsx')));
E.Quit;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
E.visible:=true;
E.Workbooks.open(Widestring(UTF8ToSys('D:\Downloads\Delphi_Lazarus\Delphi_Lazarus\lazarus\xlt\spf.xlsx')));
E.Range['D3']:=ComBoxOBJ.Items[ComBoxOBJ.ItemIndex];
end;
0
Joey
Форумчанин
943 / 564 / 220
Регистрация: 05.05.2015
Сообщений: 3,254
Записей в блоге: 2
16.05.2017, 22:55 11
oleggrv, во-первых, с Variant нельзя просто так играться, если не изучили достаточно хорошо. Даже в самых простых примерах в интернете обычно освобождают ненужную память в Variant. Раз уж создаете (по мне - лишнюю) переменную Sheet: Variant, то освобождайте ее после работы с ней.
Delphi
1
Sheet := Unassigned;
Но, имхо, она Вам здесь не нужна.
Во-вторых, S1 - это Sheet.Range['B6'], то есть еще одна Variant. Естественно, обращение к ней как к строке вызывает ошибку
Цитата Сообщение от oleggrv Посмотреть сообщение
'D:\Downloads\Delphi_Lazarus\'+S1+'.xlsx'
Текст содержится не в Range[], а в Range[].Text. Подучите excel-евский OLE

Добавлено через 2 минуты
Далее. Везде, где Вы передаете в excel строки, надо их переводить в widestring. Смотрите - у Вас напрямую передается строка здесь
Цитата Сообщение от oleggrv Посмотреть сообщение
S1:=Sheet.Range['B6'];
здесь
Цитата Сообщение от oleggrv Посмотреть сообщение
Sheet:=E.WorkSheets.Item['List1'];
здесь
Цитата Сообщение от oleggrv Посмотреть сообщение
E.Range['D3']
0
16.05.2017, 22:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2017, 22:55

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

как нарастить переменную при выборе определённой строки в Combobox
как нарастить переменную при выборе определённой строки в Combobox !! очень...

Данный файл не найден. Проверьте, что путь и имя файла указаны верно
При запуске проекта пишет, что "Exception EMCIDeviceError in module...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru