Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» прикладное программирование и не только оно...

Автор: Ahaltek
Дата сообщения: 23.09.2014 12:05
SuPriTo

Цитата:
Так ведь можно делать запросы без привязки к таблицам

Я извиняюсь. Я наверное не объяснил, таблицами называю данные на сервере а не отображение в гриде.
Для наглядности сотрудниками(они как дети) на главной форме как в Excel выводится результат запроса по основной таб "Договоры" с запретом редактирования, что бы случайно "не испортили". Выбирается одним запросом(select ... left join...) из разных таблиц на сервере(Договоры-таб1, пользователи-таб2, фирмы-таб3...). Создаются/редактируется строка(№ договора, дата договора, фирма, пользователь....) в отдельной форме с DBLookComboBox-ами(это еще + несколько query под выбор таб2,таб3...). Например, когда редактирую договор выбераем фирму(DBComboEdit)? выскакивает справочник по фирмам. Если есть фирма Duobleclick, а если фирмы нет то новая форма с добавлением фирмы(название,адрес....) Это все открываю ShowModal т.к. переключаю query. Но пользователи хотят что бы не закрывать это все открыть например таблицу Заявок и редактировать ее в еще новой форме. Как быть в таком случае?
Автор: SuPriTo
Дата сообщения: 23.09.2014 12:17

Цитата:
Как быть в таком случае?

Переделать интерфейс, некоторые действия запрограммировать в хранимых процедурах на стороне сервера и вызывать их с сервера (клиентский код на много проще будет). Справочники грузить в отдельных query и делать копии для их редактирования. Лучше сделать для каждого справочника отдельное окно с редактированием и добавлением записей, а также выбором записей из этого справочника в других окнах.
У меня ощущение, что у вас не приложение, а какая то большая каша.
Автор: Ahaltek
Дата сообщения: 23.09.2014 13:13
SuPriTo

Цитата:
Справочники грузить в отдельных query и делать копии для их редактирования

А для чего делать копии? их потом надо синхронизировать с оригиналом.


Добавлено:
У меня минимум SQL-а. Select, INSERT. В основном простая выборка, а правка, добавление средствами delphi а не SQL.
Щас буду ковырять хранимые процедуры. Благодарю за помощь.
Автор: SuPriTo
Дата сообщения: 23.09.2014 13:17

Цитата:
А для чего делать копии? их потом надо синхронизировать с оригиналом.

В этом случае не нужно делать копии.
Автор: Sorok
Дата сообщения: 24.09.2014 13:55
Для программистов.

Программа сравнения двух версий кода, текста.....
Автор: asutp2
Дата сообщения: 24.09.2014 17:07
Sorok
смотри результаты тестирования в Инстрементарии программиста
Автор: mdid
Дата сообщения: 26.09.2014 23:38
народ, где можно стянуть обычный список английских слов?
я смотрел в сторону hunspell, но там префиксы у слов непонятные, а список этих префиксов я не нашел
Автор: protoror
Дата сообщения: 29.09.2014 10:13
например тут
http://stackoverflow.com/questions/4456446/dictionary-text-file
Автор: Skif_off
Дата сообщения: 01.10.2014 11:34
comrades, подскажите, пожалуйста, в чем может быть дело и есть ли решение:
есть консольная утилита jpegtran, нормально работает с UNC-путями, но если путь превышает MAX_PATH - имеем болт ошибку Can't open file for reading на WinXP SP(2|3), при этом на Win7 нормально отрабатывает).
Автор: dred2k
Дата сообщения: 01.10.2014 18:46
Skif_off
А файловая система на XP диким случаем не FAT32 ?
Автор: Skif_off
Дата сообщения: 01.10.2014 23:35
dred2k
Обижаете Нормальная NTFS, размер кластера 4096 байт. Запустил сейчас там WinPE на базе Win7 - нормально, все файлы доступны.
Автор: protoror
Дата сообщения: 02.10.2014 15:29
Skif_off
ответ тут
http://stackoverflow.com/questions/2825798/should-i-deal-with-files-longer-than-max-path
Автор: Skif_off
Дата сообщения: 02.10.2014 16:45
protoror
Не нашёл, там всё то же самое, что и везде, вообще популярная ссылка. Мне интересно, почему программа видит файлы с over MAX_PATH и работает с ними в Win7 и не работает в WinXP, хотя префикс "\\?\" работает в обеих?
Применительно к WinXP увидел только эту фразу

Цитата:
Windows XP and I believe Vista both have problems in Explorer when nesting directories with long file names.
Автор: protoror
Дата сообщения: 03.10.2014 09:22
Skif_off
А эта строчка вам не о чем не говорит?
This limitation is baked into a lot of software written in C or C++
Проблемма в софте
Автор: Skif_off
Дата сообщения: 03.10.2014 11:02
protoror
Вы не могли бы развернуть мысль? Иначе у меня складывается впечатление, что в постах вы увидели только "MAX_PATH" и больше ничего.
Повторю, на всякий случай с цифрами:
1) на Win7x64 консольная утилита jpegtran.exe отлично работает с префиксом "\\?\" и тестовыми файлами длиной 10-12 символов + 3и символа на расширение "jpg", лежащими в тестовом же каталоге:
- уровень вложенности - 14;
- общая длина пути включая последний обратный слэш и без префикса - 330 символов.
2) на WinXP SP2 x86 и WinXP SP3 x86 консольная утилита jpegtran.exe отлично работает с префиксом "\\?\", но не видит тестовые файлы в тестовом каталоге.
Символы: латинские буквы, арабские цифры, тире, нижнее подчеркивание. Пробелов нет.

Из чего делаю вывод: консольная утилита jpegtran.exe использует юникодные версии функций, но почему-то не в полной мере использует их на старушке WinXP. Почему?
Автор: protoror
Дата сообщения: 03.10.2014 13:11
Skif_off
ну дак почитайте исходники jpegtran, как найдете почему, заодно и нам раскажете
Автор: Skif_off
Дата сообщения: 03.10.2014 14:22
protoror
Дык читалка не выросла, иначе зачем тут спрашивать?
Автор: SuPriTo
Дата сообщения: 03.10.2014 14:57
Skif_off
MAX_PATH=260 символов. Вы что хотите от WinXP, если у вас 330 символов только в пути?
Уменьшите путь и посмотрите будет ли работать? Если будет работать, значит проблема в кол-ве символов в пути.
Автор: protoror
Дата сообщения: 03.10.2014 15:57
SuPriTo
он этого не понимает, еще на win95 запускал бы и удивлялся почему не работает...
например в делфе вот так объявлено:

unit Winapi.Windows;

const
MAX_PATH = 260;
{$EXTERNALSYM MAX_PATH}
Автор: Skif_off
Дата сообщения: 03.10.2014 17:25
SuPriTo

Цитата:
MAX_PATH=260 символов. Вы что хотите от WinXP, если у вас 330 символов только в пути?

http://msdn.microsoft.com/en-us/library/aa365247.aspx

Цитата:
The Windows API has many functions that also have Unicode versions to permit an extended-length path for a maximum total path length of 32,767 characters.

Беру первую попавшуюся функцию на MSDN, GetFullPathName :

Цитата:
In the ANSI version of this function, the name is limited to MAX_PATH characters. To extend this limit to 32,767 wide characters, call the Unicode version of the function and prepend "\\?\" to the path.
...
Requirements:
Minimum supported client:
Windows XP [desktop apps only]

На Win7 работает, значит - используются юникодные версии функций. Дело в desktop apps only?

MAX_PATH, MAX_PATH, но почему-то никто не спросил "А как ты умудрился в win95 WinXP создать тестовый каталог с 330ю символами в пути?!!"...
И, к слову, список файлов в тестовом каталоге в этой самой WinXP получаю скриптом AutoIt, им же запускаю jpegtran.exe.
Автор: ItsJustMe
Дата сообщения: 03.10.2014 19:16
Skif_off
Как правильно сказал protoror, исходники jpegtran открыты, так что дебажьте ее сколько душе угодно. Заодно, может, чем ijg.org поможете.
Автор: Skif_off
Дата сообщения: 03.10.2014 21:09
ItsJustMe

Цитата:
исходники jpegtran открыты, так что дебажьте ее сколько душе угодно. Заодно, может, чем ijg.org поможете.

Может у меня с лицом что не то? Отвечал же.

Добавлено:
С английским не очень, но всё-таки написал в саппорт.
И отвечу себе же, если правильно понял: desktop apps only означает "не Metro".

Автор: wzn
Дата сообщения: 12.11.2014 11:27
DBF в разных формах (TForm).
Как-то раз понадобилось обратиться к данным из другой формы и всё получилось.
Однако, не в этот раз...
Есть две формы:
1-я - использует DBF (список событий). Никаких таблиц там не планировалось визуально.
однако, нажимаем на кнопку и попадаем в другую
2-ю - редактор этой таблицы.
Так было задумано.
В 1-й форме есть
====
uses ... ,db,dbf,FileUtil,RTTIControls, Unit2, ...
type
FForm1 = class...
...
Datasource1: Tdatasource;
DBF1:TDBF;
...
====
Во 2-ой обратных ссылок нет.
Есть:
type
FForm2 = class...
...
DBGrid1:TDBGrid;
DBNavigator: TDBNavigator;
...
====
Набираю в Unit2:
Form1.
После точки ожидание не приводит к результату.
А нужно: Form1.DBF1.Insert;
Даже если пишу руками: Err=Identifier not found.
Куда копать?
Вот в Кларионе там все на нитях и если из модуля A вызываешь модуль B, то все открытые файлы и переменные видны в B. Хотя бы в виде копий. А тут как работать?
Пока что перенёс все описания в Unit2 и из первого обращаюсь к нему. Вроде проходит, но мне нужно (наверное) не то. Unit2 может и не быть в следующей задаче, а обработать (без показа) всё-равно нужно в первом. Описать DBF и таблицу глобально - тоже не хорошо.
Нужно -то всего сделать:
В первом модуле описать/открыть/создать, обработать DBF, вывести результат (не данные с DBF, а результат их обработки по каждой записи) и закрыть DBF. И так каждые 2 секунды. При этом DBF может быть изменен внешней программой или другим модулем (за эти 2 сек). Например в модуле 2 я хочу отредактировать описанные в первом модуле DBF. Как реализовать. Пока что выходит задом на перед.
Анализировать строки нужно сравнивая (т.е. посимвольно русские буквы).
DBF - исключительно DOS кодировка. И как тогда объявлять Datasource и размеры полей?
На текущий момент описание полей идёт по ходу выполнения, а не на стадии разработки. То есть я открывая DBF еще не знаю какие поля там есть. Структура должна сформироваться перед чтением записей "по факту номенклатуры и длинны". Возможно будет вызван диалог при несоответствии.
И где учитывать распухание дабы не потерять половину строки?
Уйма вопросов. Куда задавать? Здесь?

ps. Это моя вторая программа на Лазарусе и первая с таблицами DBF.
ps2. Формат DBF: DBF-IV, CP866 - только! Есть ньюансы преобразования/редактирования?
Про функции конвертации знаю, а вот куда их воткнуть правильно?
Чтоб DBF в 2 раза не распух и чтоб строки посимвольно обрабатывать без проблем
и лишних преобразований.
Автор: ne_viens
Дата сообщения: 12.11.2014 23:26

Цитата:
...
На Win7 работает, значит - используются юникодные версии функций. Дело в desktop apps only?


Цитата:
...The shell and the file system have different requirements. It is possible to create a path with the Windоws API that the shell user interface is not able to interpret properly...


Подпилили cmd.exe под Win7 наверно.

Автор: Kmich
Дата сообщения: 13.11.2014 07:05
wzn
в unit2 должен быть в uses unit1. чтобы переменные были в области видимости.

В первом модуле описать/открыть/создать, обработать DBF, вывести результат (не данные с DBF, а результат их обработки по каждой записи) и закрыть DBF. И так каждые 2 секунды. При этом DBF может быть изменен внешней программой или другим модулем (за эти 2 сек). Например в модуле 2 я хочу отредактировать описанные в первом модуле DBF. Как реализовать. Пока что выходит задом на перед.

если данных не много то можно в память залить их и после обработки сверять данные из памяти и из DBF по каждой строке.

И как тогда объявлять Datasource и размеры полей?

а размеры полей зачем нужны? они сами в Dataset подгружаются при открытии DBF.
Автор: wzn
Дата сообщения: 13.11.2014 12:15
Всё было бы замечательно, но в Unit1 уже есть uses unit2. И при добавлении встречной команды - ругается. Однако, пока ждал ответа, обнаружил что если прописать в UNIT2 инспекторе объектов встречно (MasterSource Form1:... ) то компилирует, хотя по прежнему не дает реакции после точки по тексту на ссылки в первый UNIT1.
Ну хоть в каждой форме файлы открывать заново!
Вообще всё должно функционировать одним модулем UNIT1.
Единственное окно без коррекции базы - толко обработка событий и звонок в означеное время, типа шедулера. А правка может вообще не с этой машины идти. Так что Unit2 - рудимент. И нужен только для отладки. Вот он и должен использовать написаное в UNIT1 по максимуму. Там открытие, работа, а в модуле 2 только процедуры-паразиты. То есть уходя/запуская UNIT2 (экранную форму) я должен присосаться к уже открытым записям модуля1, поправить их "по ходу" и свалить, возможно с коррекцией базы. Модуль1 только читающим был задуман, но это не принципиально.

По ходу возник еще вопрос, если индексируем (один файл индексов) по 2-м,3-м полям, то как это написать?
Dbf1.AddIndex('По_полю1','Pole1',[ixPrimary,ixUnique]);
а куда воткнуть 'Pole2','Pole3'?
Отсортировать в UNIT2 по 3-м полям, показать там-же, переписать базу из пары десятков значений не на долго заблокировар от UNIT1 файлы и свалить удалив файл индексов (он нужен только в UNIT2!)
При этом UNIT1 работает (должен работать) толко с одним DBF, даже не пытаясь ломиться в индексы. Такое возможно?

ps. Lazarus IDE 1.1 (может в версии дело?). {$H+}
ps2. Прежние вопросы по прежнему актуальны. Особенно о черном ящике и моменте чтения/преобразование считанного DOS-текста из базы и попадания его уже разпухшим в UTF8 строки экрана (или таблицах памяти). Как же достал этот UTF8!

Где:
Поле_таблицы := CP866toUTF8(Поле_DBF); // При этом поле таблицы должно быть 2x поля DBF по длине (asString)
и где обратно преобразуется? В каком месте/свойстве/событии прописывать и что прописывать?
Как объяснить Лазарусу, что строки в памяти должны быть длиннее строк базы в 2 раза(!) минимум?
Нужно нечто, позволяющее решить эту проблему единовременно. Чтоб после просто файлы кидать в проект и не думать об их длине и не возиться с каждым полем в отдельности.

А если DBF будут с разными кодировками? Страшно даже подумать! Правда, UTF8 не предвидится в любом случае, а вот гемор при обработке обеспечен.

Мне не нужны в базе (файле DBF) поля двойного размера. Надеюсь, использовать метод в дальнейшем. Понятно, что для десятка записей не принципиально. Я ищу метод. Хорошо бы самый правильный с точки зрения Lazarus.
Пока что Lazarus пытается эти поля сделать одинаковыми.

ps3. Разработка на W7, а вот работать должно на V7,XP как минимум. А Lazarus 1.2 сильно отличается с точки зрения работы с DBF? Может там такие проблемы уже решены?
Автор: miwa
Дата сообщения: 19.11.2014 12:43
wzn

Если очень уж надо делать такую грубую ошибку, тогда uses unit1 в модуле unit2 можно написать в разделе implementation. Но я бы рекомендовал начать с другой стороны.

Архитектура приложения (если это можно назвать архитектурой) - ужасный ужас. Поэтому настоятельно рекомендую почитать вот эту статью. Можно даже несколько раз.
Автор: HNKTO
Дата сообщения: 23.11.2014 18:33
Кто нибудь в курсе, есть ли вообще с природе библиотеки сторонних (не стандартных) классы окон для Windows???
Меня конкретно интересует элемент управления в стиле таблицы (основной рабочей области из кучи ячеек) из Excel.

и ещё: вопрос тут: http://forum.ru-board.com/topic.cgi?forum=33&topic=4338&start=7400#10
Может кто-нибудь в курсе как?

заранее спасибо.
Автор: SuPriTo
Дата сообщения: 23.11.2014 21:40

Цитата:
как (какми функцииями Windows, способами) можно определить точку монитрования

http://forum.sources.ru/index.php?showtopic=361692

Цитата:
то как узнать IPшник компа с именем NETSERV?

http://www.programmersforum.ru/showthread.php?t=109503
Автор: HNKTO
Дата сообщения: 24.11.2014 17:28
SuPriTo, благодарю.
Первое не абсолютно "в точку", но помогло навести на мысль чего бы такогого забить в поиск MSDN-а чтобы получить ответ.
На С++ определение точки монтирования для сетевого диска и получение IP, если при монтировании использовалось NetBios имя компьютера выглядит так:
[more]Имя сетевого диска (в формате напр. Z:\)передаётся как параметр запускаемой программы.

Код: #pragma warning( disable : 4996 )

#include <windows.h>
//#include <Winnetwk.h>//требует Mpr.lib //все три последующих заголовка включены в windows.h (по крайней мере в MSVS2005)
//#include <winsock2.h>//требует Ws2_32.lib
//#include <ws2tcpip.h>//требует Ws2_32.lib
#include <stdio.h>
#include <conio.h>

char* ProcessWNGUErrors(int err)
{
    switch(err)
    {
    case NO_ERROR:
        return "No Error";
    case ERROR_BAD_DEVICE:
        return "ERROR_BAD_DEVICE";
    case ERROR_CONNECTION_UNAVAIL:
        return "ERROR_CONNECTION_UNAVAIL";
    case ERROR_EXTENDED_ERROR:
        return "ERROR_EXTENDED_ERROR, do WNetGetLastError to get details!";
    case ERROR_MORE_DATA:
        return "ERROR_MORE_DATA";
    case ERROR_NOT_SUPPORTED:
        return "ERROR_NOT_SUPPORTED";
    case ERROR_NO_NET_OR_BAD_PATH:
        return "ERROR_NO_NET_OR_BAD_PATH";
    case ERROR_NO_NETWORK:
        return "ERROR_NO_NETWORK";
    case ERROR_NOT_CONNECTED:
        return "ERROR_NOT_CONNECTED";
    }
    return "uncnown error";
}

int main(int argc, char *argv[ ], char *envp[ ])
{
    int err;
    char Buffer[1000];
    DWORD BufferSz = 1000;
    UNIVERSAL_NAME_INFO *puni = (UNIVERSAL_NAME_INFO*) &Buffer;
    REMOTE_NAME_INFO *prni = (REMOTE_NAME_INFO*) &Buffer;
    if(argc < 2)
    {
        printf("No argument!");
        return 1;
    }
    char *dest = argv[1];
    if(dest[1] != ':')
    {
        printf("Local paths only!");
        return 1;
    }
    printf("Passed path: %s\n", dest);
    //WNetGetUniversalName Раскрывает данные смонтированного сетевого диска
    //UNIVERSAL_NAME_INFO_LEVEL даёт просто строку, переданную в мастере подключения диска
    //REMOTE_NAME_INFO_LEVEL выдаёт расширенную информацию о созданном подключении
    err = WNetGetUniversalName(dest, UNIVERSAL_NAME_INFO_LEVEL, (LPVOID) &Buffer, &BufferSz);
    printf("WNetGetUniversalName for UNIVERSAL_NAME_INFO_LEVEL processed with error %i (%s)\n", err, ProcessWNGUErrors(err));
    if(err == NO_ERROR)
        printf("returned params:\nUniversalName: %s\n", puni->lpUniversalName);
    printf("============================================\n");
    err = WNetGetUniversalName(dest, REMOTE_NAME_INFO_LEVEL, &Buffer, &BufferSz);
    printf("WNetGetUniversalName for REMOTE_NAME_INFO_LEVEL processed with error %i (%s)\n", err, ProcessWNGUErrors(err));
    if(err == NO_ERROR)
        printf("returned params:\nConnectionName: %s\nRemainingPath: %s\nUniversalName: %s\n",
            prni->lpConnectionName, prni->lpRemainingPath, prni->lpUniversalName);
    printf("press any key to retrive host info...\n");
    getch();
    printf("============================================\n");
    char HostName[260] = {0};
    { //тут находим конец имени хоста в полном пути
        int ln=2;
        while(ln<260)
        {
            if(prni->lpUniversalName[ln] == '\\')
                break;
            ln++;
        }
        ln -= 2;
        memcpy(HostName, prni->lpUniversalName+2, ln); //и вырезаем его
    }
    if(!isalpha(HostName[0]))
    {
        printf("NO host name, IP is: %s\n", HostName);
        return 0;
    }
    printf("host name is: %s\n", HostName);
//далее выковыриваем IP адрес из имени хоста
    // Declare and initialize variables
DWORD dwError;
    WSADATA wsaData;
int iResult;
    struct hostent *remoteHost;
    struct in_addr addr;
    // Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0)
    {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
    printf("Calling gethostbyname with %s\n", HostName);
    remoteHost = gethostbyname(HostName);
    if (remoteHost == NULL)
    {
dwError = WSAGetLastError();
if (dwError != 0)
        {
if (dwError == WSAHOST_NOT_FOUND)
            {
printf("Host not found\n");
return 1;
}
            else if (dwError == WSANO_DATA)
            {
printf("No data record found\n");
return 1;
}
            else
            {
printf("Function failed with error: %ld\n", dwError);
return 1;
}
}
}
    else
    {
printf("Function returned:\n");
printf("\tOfficial name: %s\n", remoteHost->h_name);
printf("\tAlternate names: %s\n", remoteHost->h_aliases);
printf("\tAddress type: ");
switch (remoteHost->h_addrtype)
        {
case AF_INET:
printf("AF_INET\n");
break;
/*case AF_INET6:
printf("AF_INET\n");
break;*/
case AF_NETBIOS:
printf("AF_NETBIOS\n");
break;
default:
printf(" %d\n", remoteHost->h_addrtype);
break;
}
printf("\tAddress length: %d\n", remoteHost->h_length);
addr.s_addr = *(u_long *) remoteHost->h_addr_list[0];
printf("\tFirst IP Address: %s\n", inet_ntoa(addr));
}


        
    return 0;
}

Страницы: 12345678910111213141516171819202122232425262728293031

Предыдущая тема: Borland Developer Studio 2006 и Oracle пакеты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.