Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2

Сохранение последней позиции в диалогах

07.07.2024, 05:37. Показов 5019. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Или глаз замылился или гуглить в яндексе разучился. При работе программы, каждый раз вызывая диалоги открытия и и сохранения файла (TOpen/TSaveDialog), позиция расширения файла находится в начальной позиции списка. Подскажите, как просто и элегантно сделать так, чтобы сохранялась предыдущая позиция? Диалоги создаю динамически, типа
C++
1
2
3
    TOpenDialog *od = new TOpenDialog(this);
 
       od->Filter="DiginW (*.diw)|*.diw|MapInfo (*.mif)|*.mif|GeoJSON (*.geojson)|*.geojson|Google Maps (*.kml)|*.kml|Файлы произвольного формата (*.txt, *.csv)|*.txt;*.csv";
Заранее благодарю за помощь!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.07.2024, 05:37
Ответы с готовыми решениями:

Найти номер позиции последней запятой
Известно, что среди S1,...,Sn есть по крайней мере одна запятая. Найти такое натуральное i, что Si-Последняя по порядку запятая

Вычисление позиции последней единицы в байте
Задача: определить номер последней единицы в массиве байт Написал код: TITLE Prog .MODEL small .STACK 100h .DATA B DB...

Поиск последней позиции символа в строке
Есть строка, в нее получаю путь к файлу, нужно обрезать до имени, следовательно нужно искать позицию последнего символа '\'. Есть...

9
Модератор
 Аватар для D1973
9923 / 6459 / 2457
Регистрация: 21.01.2014
Сообщений: 27,410
Записей в блоге: 3
07.07.2024, 05:44
Лучший ответ Сообщение было отмечено TrollHammer как решение

Решение

FilterIndex?
1
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
08.07.2024, 08:49  [ТС]
D1973, Все, Уважаемый, пора мне на помойку!
0
Модератор
 Аватар для D1973
9923 / 6459 / 2457
Регистрация: 21.01.2014
Сообщений: 27,410
Записей в блоге: 3
08.07.2024, 13:19

Не по теме:

TrollHammer, туда не надо торопиться


0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
14.07.2024, 12:16  [ТС]
закину реализацию на всякий случай, вдруг кому пригодится
Кликните здесь для просмотра всего текста
C++
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
void __fastcall TfMain::nLoadClick(TObject *Sender)
{
    TOpenDialog *od = new TOpenDialog(this);
 
       od->Filter="DiginW (*.diw)|*.diw|MapInfo (*.mif)|*.mif|GeoJSON (*.geojson)|*.geojson|Google Maps (*.kml)|*.kml|Файлы произвольного формата (*.txt, *.csv)|*.txt;*.csv";
       od->FilterIndex = iFIO;
 
        if(od->Execute())
         if(od->FileName!="")
         {
            PageControl1->ActivePage = tsSolve; //это в моей проге
 
           sgCalc->RowCount=2; //это в моей проге
           for(int i=1; i<5; i++)  //это в моей проге
            sgCalc->Cells[i][1]="";  //это в моей проге
 
            switch(od->FilterIndex)
            {
               case 1:
                fLoadDiw(od->FileName);
                break;
               case 2:
                fLoadMIF(od->FileName);
                break;
               case 3:
                fLoadGeoJSON(od->FileName);
                break;
               case 4:
                fLoadKML(od->FileName);
                break;
               case 5:
                fLoadOth(od->FileName);
                break;
               default:
                break;
            }
 
            iFIO = od->FilterIndex;
         }
 
    delete od;
}


переменная iFIO обявлена в хедере формы как int, в FormCreate присваевается значение = 0
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
07.08.2024, 13:54
Лучший ответ Сообщение было отмечено TrollHammer как решение

Решение

Понимаю, что уже поздно, но все-таки...
Чего бы строки с 17 по 37-ю не заменить на
C++
1
2
3
4
5
        void __fastcall (__closure *func[5])(String) = { &fLoadDiw, &fLoadMIF, &fLoadGeoJSON, &fLoadKML, &fLoadOth };
        // или так, если функции - не методы класса:
        // void (*func[5])(String) = { fLoadDiw, fLoadMIF, fLoadGeoJSON, fLoadKML, fLoadOth };
 
        func[od->FilterIndex - 1](od->FileName);
?
1
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
12.08.2024, 05:47  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
void __fastcall (__closure *func[5])(String) ...
компилятор ругнулся на __fastcall, убрал и все ОК!
Благодарю за такой компактный метод вызова функций. А то все по старинке через switch-case.

Добавлено через 5 минут
Кстати, уважаемый volvo, не подскажете, а как данную конструкцию применить к
Кликните здесь для просмотра всего текста
C++
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
          switch(sd->FilterIndex)
          {
              case 1:
               fTxtExp(sd->FileName+".txt");
               break;
 
              case 2:
               fMifExp(sd->FileName+".mif", 0); //функция формирует файл, где только точки с координатами
               break;
 
              case 3:
               fMifExp(sd->FileName+".mif", 1);//функция выгружает полигон по координатам точек
               break;
 
              case 4:
               fDiwExp(sd->FileName+".diw");
               break;
 
              case 5:
               fGPXExp(sd->FileName+".gpx");
               break;
 
              case 6:
               fJSONExp(sd->FileName+".geojson");
               break;
 
              default: break;
          }
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
12.08.2024, 09:42
Лучший ответ Сообщение было отмечено TrollHammer как решение

Решение

И это можно, но совсем не так красиво, как было раньше:

C++
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
// класс формы
    void fTxtExp(String, int = 0);
    void fMifExp(String, int);
    void fDiwExp(String, int = 0);
    void fGPXExp(String, int = 0);
    void fJSONExp(String, int = 0);
    
// реализация
typedef struct
{
    void (__closure *f)(String, int = 0);
    String ex;
} R;
 
// ... обработчик нажатия кнопки
 
        R func[6] =
        {
            {&fTxtExp, ".txt"},
            {&fMifExp, ".mif"},
            {&fMifExp, ".mif"},
            {&fDiwExp, ".diw"},
            {&fGPXExp, ".gpx"},
            {&fJSONExp, ".geojson"},
        };
        R curr = func[od->FilterIndex - 1];
        curr.f(od->FileName + curr.ex, od->FilterIndex - 2);
, но я бы так не делал, наверное...


P.S. А под 64 бита на XE4+ можно вообще вот так:

C++
1
2
3
4
5
6
7
8
9
10
        void (__closure *func[])(String s) =
        {
            [](String s){fTxtExp(s + ".txt");},
            [](String s){fMifExp(s + ".mif", 0);},
            [](String s){fMifExp(s + ".mif", 1);},
            [](String s){fDiwExp(s + ".diw");},
            [](String s){fGPXExp(s + ".gpx");},
            [](String s){fJSONExp(s + ".geojson");}
        };
        func[od->FilterIndex - 1](od->FileName);
1
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
13.08.2024, 10:29  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
, но я бы так не делал, наверное...
Да, слишком громоздко. Конструкция под х64 элегантнее, но к сожалению моя версия абракадабры компилирует только под х86 и увы...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
14.08.2024, 09:52
Для x86 можно и вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
        typedef void (__closure *F)(String, int = 0);
        std::map< int, std::pair<F, String> > m;
 
        m[1] = std::make_pair(&fTxtExp, ".txt");
        m[2] = std::make_pair(&fMifExp, ".mif");
        m[3] = std::make_pair(&fMifExp, ".mif");
        m[4] = std::make_pair(&fDiwExp, ".diw");
        m[5] = std::make_pair(&fGPXExp, ".gpx");
        m[6] = std::make_pair(&fJSONExp, ".geojson");
           
        m[od->FilterIndex].first(od->FileName + m[od->FilterIndex].second, od->FilterIndex - 2);
, не сильно длиннее, чем под x64
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.08.2024, 09:52
Помогаю со студенческими работами здесь

Найти номер позиции последней запятой в строке
Дана строка символов. Найти номер позиции последней запятой в строке.

Найдите позиции вхождения в строку первой и последней запятой
Ввести строку. Найдите позиции вхождения в строку первой и последней запятой.

В данной строке определить номер позиции последней запятой
Нужно создать программу, которая в данной текстовой строке определяет номер позиции последней запятой. Вот мой (безрезультатный)...

В каждой строке текста определить номер позиции последней точки
Дан текст (массив строк). Составить программу, которая в каждой строке текста определяет номер позиции последней точки.

Подпрограмма: сдвиг элементов массива влево на 1 ячейку, начиная с последней позиции
Дан массив действительных чисел размера n. Выполнить сдвиг элементов массива влево на 1 ячейку, начиная с последней позиции. В последнюю...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru