1

(9 replies, posted in General)

derek wrote:

Olá Roberto,
I am also an ex Clarion user - ultimately, we used to produce applications in Clipper but would initially use Clarion so we could quickly mock-up demonstrations for customers to show them how their basic requirements would be met;  it was invaluable in making sure everyone had the same understanding of how the finished program would work.
I think that's why I have such a soft-spot for MVD - 25 years later and there are so many similarities smile
Espero que você esteja bem,
Derek.

Hi Derek, thanks for sharing this information. As I’ve mentioned before, I didn’t work professionally in programming, but I did use a few languages to solve administrative problems. I started with dBASE III and IV, then moved on to Clipper, FoxPro, Access, and so on, but MVD is truly special. I hope you’re doing well, too! Best regards.

2

(9 replies, posted in General)

Just for reference: back in 2001, I worked at a company that used the Clarion 6.0 language, developed by SoftVelocity (www.softvelocity.com). It is now up to version 12! Based on a data dictionary populated by the user, Clarion—if the user chooses—automatically builds a complete application, including grids, CRUD forms, reports, and more. The video below shows version 1.5 (from 1995); although it is old, it gives a glimpse of what Clarion was capable of producing even back then.



https://drive.google.com/file/d/1uGxWwD … sp=sharing

3

(9 replies, posted in General)

This is one of the many videos about Dataflex on YouTube, but it is in Portuguese.


https://youtu.be/JfCR3lhxmnw

4

(9 replies, posted in General)

In 1992, I worked at a company that used the DataFlex 2.2 language (MS-DOS). Although I worked in administration, I became interested in how it functioned and was impressed by its RAD capabilities. Today, it is known as "Visual DataFlex" and was created by "Data Access." I recently noticed that the manufacturer has made a "Personal" version available at the link below for free, non-commercial use. It has improved significantly... I’m sharing this as a suggestion for anyone interested in checking it out. There are several videos on YouTube demonstrating how it works. I think it's worth a look!

P.S. – It supports various databases and compiles applications into portable 32-bit and 64-bit formats.


https://www.dataflex.dev/pricing-280

https://www.dataflex.dev/onboarding-435?screen=register

5

(6 replies, posted in General)

jean.brezhonek wrote:

Hello everyone!

Here's a little document I always keep handy that might be useful for anyone wanting to customize the colors of their MVD projects.
Enjoy!

JB

Thankyou Jean!

sparrow wrote:

Hi Roberto


Did everything work out?
If you want to display TOTAL in your footer, the full code will look like this, assuming I calculated the table columns correctly. The result of the last formula will remain in the footer.

procedure frm_grid_zoom_TableGrid_subnotas_OnChange (Sender: TObject);
begin
  frm_grid_zoom.TableGrid_subnotas.Columns[5].Footer.FormulaKind := fkMinimum;
  frm_grid_zoom.TableGrid_subnotas.CalculateFooter;
  frm_grid_zoom.Edit_min.text := frm_grid_zoom.TableGrid_subnotas.Columns[5].Footer.Caption;
  frm_grid_zoom.TableGrid_subnotas.Columns[5].Footer.FormulaKind := fkMaximum;
  frm_grid_zoom.TableGrid_subnotas.CalculateFooter;
  frm_grid_zoom.Edit_max.text := frm_grid_zoom.TableGrid_subnotas.Columns[5].Footer.Caption;
  frm_grid_zoom.TableGrid_subnotas.Columns[5].Footer.FormulaKind := fkAverage;
  frm_grid_zoom.TableGrid_subnotas.CalculateFooter;
  frm_grid_zoom.Edit_med.text := frm_grid_zoom.TableGrid_subnotas.Columns[5].Footer.Caption;
  frm_grid_zoom.TableGrid_subnotas.Columns[5].Footer.FormulaKind := fkSum;
  frm_grid_zoom.TableGrid_subnotas.CalculateFooter;
end; 

Hi Sparrow, everything went well and thank you again.

jrga wrote:
sparrow wrote:

Hi jrga, domebil


Sometimes you can try it this way. You don't even have to display the footer.
Just indicate the correct column number.

procedure frm_grid_zoom_TableGrid_subnotas_OnChange (Sender: TObject);
begin
  frm_grid_zoom.TableGrid_subnotas.Columns[0].Footer.FormulaKind := fkMinimum;
  frm_grid_zoom.TableGrid_subnotas.CalculateFooter;
  frm_grid_zoom.Edit_min.text := frm_grid_zoom.TableGrid_subnotas.Columns[0].Footer.Caption;
  frm_grid_zoom.TableGrid_subnotas.Columns[0].Footer.FormulaKind := fkMaximum;
  frm_grid_zoom.TableGrid_subnotas.CalculateFooter;
  frm_grid_zoom.Edit_max.text := frm_grid_zoom.TableGrid_subnotas.Columns[0].Footer.Caption;
  frm_grid_zoom.TableGrid_subnotas.Columns[0].Footer.FormulaKind := fkAverage;
  frm_grid_zoom.TableGrid_subnotas.CalculateFooter;
  frm_grid_zoom.Edit_med.text := frm_grid_zoom.TableGrid_subnotas.Columns[0].Footer.Caption;
  frm_grid_zoom.TableGrid_subnotas.Columns[0].Footer.FormulaKind := fkNone;
end;  

Hi Sparrow, thanks for providing this alternative method! I followed this approach because the table grid already had the total for the "value" column in the footer, and I wanted to display the average, minimum, and maximum values.

https://i.postimg.cc/qqq1B4zY/tablegrid-mvd.png

derek wrote:

Hello All,
Yet another variation on the same theme is to use the tablegrid's in-built footer function and then hide the footer.
The footer values (count, sum, minimum, maximum, average, distinct) can then simply be copied into edit fields.
Derek.


Hi Derek, that's a great alternative too! Thanks!

sparrow wrote:

Hi jrga, domebil


Sometimes you can try it this way. You don't even have to display the footer.
Just indicate the correct column number.

procedure frm_grid_zoom_TableGrid_subnotas_OnChange (Sender: TObject);
begin
  frm_grid_zoom.TableGrid_subnotas.Columns[0].Footer.FormulaKind := fkMinimum;
  frm_grid_zoom.TableGrid_subnotas.CalculateFooter;
  frm_grid_zoom.Edit_min.text := frm_grid_zoom.TableGrid_subnotas.Columns[0].Footer.Caption;
  frm_grid_zoom.TableGrid_subnotas.Columns[0].Footer.FormulaKind := fkMaximum;
  frm_grid_zoom.TableGrid_subnotas.CalculateFooter;
  frm_grid_zoom.Edit_max.text := frm_grid_zoom.TableGrid_subnotas.Columns[0].Footer.Caption;
  frm_grid_zoom.TableGrid_subnotas.Columns[0].Footer.FormulaKind := fkAverage;
  frm_grid_zoom.TableGrid_subnotas.CalculateFooter;
  frm_grid_zoom.Edit_med.text := frm_grid_zoom.TableGrid_subnotas.Columns[0].Footer.Caption;
  frm_grid_zoom.TableGrid_subnotas.Columns[0].Footer.FormulaKind := fkNone;
end;  

Hi Sparrow, thanks for providing this alternative method! I followed this approach because the table grid already had the total for the "value" column in the footer, and I wanted to display the average, minimum, and maximum values.

I didn't know about this feature in MVD. I discovered that it works and met my needs. Sharing.


procedure frm_grid_zoom_TableGrid_subnotas_OnChange (Sender: TObject);
begin
   frm_grid_zoom.Edit_med.Value :=
       sqlexecute('select avg("tbl_grid.valor") from ('+frm_grid_zoom.TableGrid_subnotas.dbGetSqlStatement+')');
   frm_grid_zoom.Edit_min.Value :=
       sqlexecute('select min("tbl_grid.valor") from ('+frm_grid_zoom.TableGrid_subnotas.dbGetSqlStatement+')');
   frm_grid_zoom.Edit_max.Value :=
       sqlexecute('select max("tbl_grid.valor") from ('+frm_grid_zoom.TableGrid_subnotas.dbGetSqlStatement+')');
end;
k245 wrote:

Setting Column Width

My Visual Database has the ability to manually adjust column widths for each table view. But in some cases, you want more intelligent behavior: automatic alignment of the data width or alignment of the width when the table size is changed. Using scripts you can achieve the desired effect.


I bring to the attention of readers several scripts that will allow the user to independently select the level of automation for column alignment he needs from four available options:


Default – manual alignment
Proportional – equal width for all columns, retained when the table size is changed
According to data – the width is set so that all data is displayed entirely, without cropping
Stretch last – the last column is stretched and fills the visible area of the table


https://k245.ru/en/mvdb-en/setting-column-width.html


Hi K245, thanks for replying! I still have a lot to learn about MVD. I'm not a programmer and I create programs because I really enjoy programming, and with MVD, this happens empirically based on the wealth of knowledge available on the forum. But I realize that you, Sparrow, and Derek (sorry if I don't remember others) have a deep understanding of MVD. Thank you.

derek wrote:

Olá Roberto,
Como vai você?
I vaguely remember having a similar problem a few years back but can't remember any details sad.
Maybe if you can attach your project, someone might be able to spot the reason (but you're right - normally it would remember column widths from the previous session).
Derek.


Hi Derek, I'm doing well and I hope you are too. I managed to get the BestFitColumns(bfBoth) command working. The problem was that I placed this command in procedure_tablegrid_OnChange (which is correct), but it had no effect because the record was being loaded via script through procedure_tablegrid_OnCellClick. After placing it in procedure_tablegrid_OnCellClick, everything went back to normal. Thank you for your attention!

Hello everyone! I have a project that includes a table grid, and I can't adjust the columns to the column content or column titles. I've already used BestFitColumns(), with bfBoth and bfHeader in procedure...tablegrid_OnChange. A native feature (I think it's native) of the table grid is to "remember" the column sizes after real-time adjustment by the user. Even that isn't working... I've also considered storing the column sizes in a table as they are adjusted, which would solve any similar problem. If anyone can help, I would appreciate it.

sparrow wrote:

Olá RobertoVeja o exemplo

Hi Sparrow, it worked! I wasn't using "ExtractFileName". Thanks!

prahousefamily wrote:

Como usar script para - Carregar arquivo do banco de dados para dbfile1 - Carregar arquivo do caminho para dbfile1 - Salvar arquivo de dbfile1 para banco de dados - Salvar arquivo de dbfile1 para caminho ('C:Path\')

Hi! How are you? I'm having the same problem and haven't been able to find a solution on the forum. I want to load the contents of a DBfile field (linkfile type) from a database via script into a continuous DBfile field in a form. Were you able to solve your problem?

ansel wrote:

[citação=Ansel]Olá. Existe um link válido para baixar este projeto para estudo?isso não é válido:https://drive.google.com/file/d/1kqnN06 … sp=sharingThanks

Hello, I re-uploaded the application. Follow link below. I found an explanation of the version of this application in my files, as follows:

https://drive.google.com/file/d/1R0vfaQnBZ5YCqY-xL65Ofdn3M7cXFwLT/view?usp=sharing

"QlikView Personal Edition is a free version of QlikView for personal use. It is the full QlikView Desktop product and uses the same installation package. However, there are some limitations and things to note:

QlikView Documents: In QlikView Personal Edition, every document is saved with a user key that associates the file with the computer on which it was created. This means that you cannot use your QlikView documents on other computers, share your QlikView documents with another unregistered user, and cannot open another user's QlikView document. However, documents created in QlikView Personal Edition can be used with a licensed copy of QlikView Desktop and can also be published to a QlikView Server.

File recovery: If you change computers, you will not be able to open documents previously created with QlikView Personal Edition. In this case, you can choose to recover your files. QlikView will accept 4 user key changes in a document. After that, the error message “Key length has reached maximum” will be displayed and the document will no longer be opened.

Support: QlikView Personal Edition users are not eligible for phone or email support from Qlik, but can get excellent support for QlikView from our Qlik Community.

To create a dashboard in QlikView Personal Edition, you can follow the steps below:

In the application overview, right-click Dashboard and select Open and edit to open the first folder.

You will use a combination of standard editing mode and advanced editing mode.
After creating your visualizations, you will use advanced editing mode to customize them."

17

(22 replies, posted in General)

jrga wrote:

I made some modifications to the "Family Album" project, created by K245 and which received corrections and improvements from Sparrow, listed below:

01 - Translation of the "captions" (names of forms, labels and buttons) into Portuguese through instructions included at the end of the script between BEGIN and END.

02 - In the search field on the main screen, I included:
* Search by CATEGORY by simply typing the name, after unchecking the "TAG" and "OR" checkboxes. In the previous form, the user had to select all the TAGs of a category.

* The content of the search field is cleared with 2 clicks.
03 - Inclusion of a "NO TAG" button for searching for photos without TAGs, considering that photos without TAGs do not have an associated category, which can be more easily corrected with this.

04 - Inclusion of a Backup button, which zips the "sqlite.db" database and the "image" folder, which contains the photos. Sparrow provided the script for zipping the database.

05 - In the "image editing" form, below the thumbnail and TAG field, I included a field that gives access to a folder selected by the user and another that executes a file also chosen by the user. When one of these fields is filled in, a red bar appears over the thumbnail with the title "Double Click". When clicked, the folder is opened or the file is executed. I included this option in case the user has many folders with photos. Thus, they can choose one photo from each folder. I chose to convert the photos from a folder into a single PDF file, which is opened when I double-click on the thumbnail. The use of this feature is optional.

P.S.: I forgot to mention:
* At the top of the "TAG" grid, I included a button to call "Categories" directly;
* In the TAG and Category grids, I included a column with the total number of photos that use a specific TAG or category. This makes it easier to delete TAGs or Categories without any linked photos.
* I created a view - it's in the script - that is used to display only photos whose categories have the new "hide" field = false (or zero in SQL), which can be filled in during category registration. Thus, if one or more photos have a single TAG linked to a "hidden" category, these photos will not be displayed.

18

(22 replies, posted in General)

I made some modifications to the "Family Album" project, created by K245 and which received corrections and improvements from Sparrow, listed below:

01 - Translation of the "captions" (names of forms, labels and buttons) into Portuguese through instructions included at the end of the script between BEGIN and END.

02 - In the search field on the main screen, I included:
* Search by CATEGORY by simply typing the name, after unchecking the "TAG" and "OR" checkboxes. In the previous form, the user had to select all the TAGs of a category.

* The content of the search field is cleared with 2 clicks.
03 - Inclusion of a "NO TAG" button for searching for photos without TAGs, considering that photos without TAGs do not have an associated category, which can be more easily corrected with this.

04 - Inclusion of a Backup button, which zips the "sqlite.db" database and the "image" folder, which contains the photos. Sparrow provided the script for zipping the database.

05 - In the "image editing" form, below the thumbnail and TAG field, I included a field that gives access to a folder selected by the user and another that executes a file also chosen by the user. When one of these fields is filled in, a red bar appears over the thumbnail with the title "Double Click". When clicked, the folder is opened or the file is executed. I included this option in case the user has many folders with photos. Thus, they can choose one photo from each folder. I chose to convert the photos from a folder into a single PDF file, which is opened when I double-click on the thumbnail. The use of this feature is optional.

19

(4 replies, posted in General)

Happy New Year!

20

(22 replies, posted in General)

sparrow wrote:

Hi Roberto


The code allows you to compress the sqlite.db file using Windows tools in zip format without additional copying and compression operations.
Caution: TDataSet resources must be freed.


Hi Sparrow, thank you for resolving the sqlite.db zipping issue.

21

(22 replies, posted in General)

Backup Routine (I combined 2 scripts from the forum):
1 - backs up the sqlite.db file, but MVD doesn't allow compression.
2 - creates a zipped backup of the "image" folder, which contains the photos.


procedure frmImage_btn_bkp_OnClick (Sender: TObject; var Cancel: boolean);
var
    SaveDialog: TSaveDialog;
    sFileName,sDirName: string;
begin
    showmessage('Para iniciar Backup do Banco de Dados pressione OK');
    sFileName := 'Sqlite-' + FormatDateTime('dd-mm-yyyy hh-nn-ss', now)+'.db';
    SaveDialog := TSaveDialog.Create(frmimage);
    SaveDialog.FileName := sFileName;
    SaveDialog.Filter := 'Database|*.db|Any file|*.*';
    SaveDialog.Options := ofOverwritePrompt+ofHideReadOnly+ofEnableSizing;

    if SaveDialog.Execute then
    begin
        CopyFile(ExtractFilePath(Application.ExeName)+'sqlite.db', SaveDialog.FileName);
        ShowMessage('Banco de dados foi salvo na pasta especificada');
    end;

    SaveDialog.Free;

    showmessage('Para iniciar Backup da pasta de imagens pressione OK');
    sDirName := 'Imagens-' + FormatDateTime('dd-mm-yyyy hh-nn-ss', now)+'.zip';
    SaveDialog := TSaveDialog.Create(frmimage);
    SaveDialog.FileName := sDirName;
    SaveDialog.Filter := 'Selecione uma pasta para salvar|*.*';
    SaveDialog.Options := ofPathMustExist + ofEnableSizing;

    if SaveDialog.Execute then
    begin
        frm_aviso.Show;
        CompressZipDirectory(ExtractFilePath(Application.ExeName)+'image\', SaveDialog.FileName);
        frm_aviso.close;
        ShowMessage('Imagens foram salvos na pasta especificada');
    end;

    SaveDialog.Free;
end;

22

(22 replies, posted in General)

begin
    //Change caption and hint to the Portuguese language and etc.
    frmImage.Caption := 'Álbum de Fotografias';
    frmImage.btnDelete.caption := 'Excluir';
    frmImage.btnEdit.caption := 'Editar';
    frmImage.btnNew.caption := 'Adicionar';
    frmImage.btnPlay.caption := 'Slides';
    frmImage.chbOR.caption := 'OU';
    frmImage.chbShowPreview.caption := 'Visualizar';
    frmImage.chbTag.caption := 'TAG';
    frmImage.labDescription.caption := 'Descrição';
    frmImage.labName.caption := 'Nome';
    frmImage.btnFirst.Hint := 'Vai para a primeira página';
    frmImage.btnLast.Hint := 'Vai para a última página';
    frmImage.btnNext.Hint := 'Vai para a página anterior';
    frmImage.btnPred.Hint := 'Vai para a primeira página';
    frmImage.btnTag.Hint := 'Selecione as tags do diretório';
    frmImage.edtFilter.Hint := 'Clique 2x para limpar filtro.';
    frmImage.edtFilter.TextHint := 'Busca por marca (TAG)';
    frmImage.Epage.Hint := 'Entre com a página e pressione ENTER';

    frmTag.Caption := 'Marcação (TAG)';
    frmTag.btnClear.Hint := 'Limpar seleção';
    frmTag.btnDelete.Caption := 'Excluir';
    frmTag.btnEdit.Caption := 'Editar';
    frmTag.btnNew.Caption := 'Adicionar';
    frmTag.btnSelect.Caption := 'Selecionar';
    frmTag.labTagCategory.Caption := 'Categoria:';

    frmTagEdit.Caption := 'Marcação (TAG)';
    frmTagEdit.btnCancel.Caption := 'Cancelar';
    frmTagEdit.btnSave.Caption := 'Salvar';
    frmTagEdit.labCategory.Caption := 'Categoria';
    frmTagEdit.labName.Caption := 'Marcação (TAG)';

    frmTagCategory.Caption := 'Categorias das TAGs';
    frmTagCategory.btnDelete.Caption := 'Excluir';
    frmTagCategory.btnEdit.Caption := 'Editar';
    frmTagCategory.btnNew.Caption := 'Adicionar';
    frmTagCategory.tgrMain.dbListFieldsNames   := 'Categoria';

    frmTagCategoryEdit.Caption := 'Categoria';
    frmTagCategoryEdit.btnCancel.Caption := 'Cancelar';
    frmTagCategoryEdit.btnSave.Caption := 'Salvar';
    frmTagCategoryEdit.labName.Caption := 'Nome';

    frmImageEdit.Caption := 'Edição de imagem';
    frmImageEdit.btnCancel.Caption := 'Cancelar';
    frmImageEdit.btnEdit.Caption := 'Editar';
    frmImageEdit.btnSave.Caption := 'Salvar';
    frmImageEdit.Label1.Caption := 'Nome';
    frmImageEdit.Label2.Caption := 'Descrição';
    frmImageEdit.Label3.Caption := 'Data/hora de criação';
    frmImageEdit.Label4.Caption := 'Pré-visualização';
    frmImageEdit.Label5.Caption := 'Marcação (TAG)';
    //frmImageEdit.imgPreview.Hint := 'Clique 2x para abrir arquivo abaixo se existir.';

    frmImageEditor.caption := 'Inclusão de Foto e Edição de Miniatura';
    frmImageEditor.btnCancel.caption := 'Cancelar';
    frmImageEditor.btnClear.caption := 'Limpa';
    frmImageEditor.btnFilter.caption := 'Carrega';
    frmImageEditor.btnSave.caption := 'Salvar';

    frmShow.caption := 'Slides';
    frmShow.btnFirst.Hint := 'Primeiro Slide';
    frmShow.btnFullScreen.Hint := 'Tela cheia';
    frmShow.btnLast.Hint := 'Último Slide';
    frmShow.btnNext.Hint := 'Próximo Slide';
    frmShow.btnPred.Hint := 'Slide Anterior';
    frmShow.btnSettings.Hint := 'Setup';
    frmShow.labDescription.caption := 'Descrição';
    frmShow.labName.caption := 'Nome';
    frmShow.btnPlay.Hint := 'Exibe Slides sequencialmente';

    //It improved the display of full-screen forms and their buttons on my computer.
    frmImage.WindowState := wsMaximized;
    frmImageEditor.WindowState := wsMaximized;
    frmImageEdit.WindowState := wsMaximized;
end.

23

(22 replies, posted in General)

sparrow wrote:

Hi all,


ESC exit added to some forms.
The FullScreen button has been enabled.
Two thumbnails have been added to the main screen.
Thumbnail cropping behavior has been changed:
- When adding an image, the default thumbnail is the entire image.
- The ability to crop a thumbnail of any size.
- Thumbnail cropping within the image boundaries.
Other changes...

Hi Sparrow! I tested the improvements you implemented in the Photo Album project, created by K245:
- "ESC" on certain screens.
- Full screen in the "Slides" form.
- Full filling of the initial screen with thumbnails.
- Automatic cropping when adding new images.
- Thumbnail cropping of any size, which allowed zooming in on any part of the image!

Everything looks great! Congratulations and thank you. Best regards.

24

(22 replies, posted in General)

sparrow wrote:

Hi Roberto


Could you elaborate on this?

- When the initial screen has more than one page of thumbnails, two thumbnails are missing to complete the first page...

A screenshot would be ideal.

As for finalizing the project, it's all in your hands. I'm just trying to fix a few things or do things differently. For me it's a good study...


P.S.
I understand what you're talking about.
In Project K245, the program was configured to display 30 thumbnails per screen (you see three rows of eight thumbnails, plus six more), which was optimal at the time. When I made changes to the code that sped up thumbnail display, I didn't change the number of thumbnails displayed. The trick is that if display scaling is applied in Windows, the layout changes. It also changes when the window is resized or maximized to full screen.

Hi Sparrow, screenshot attached. I put it in full screen and the problem persists. It's just a cosmetic detail and doesn't interfere with operation. It's fine if it's not possible to change. Regards

25

(22 replies, posted in General)

sparrow wrote:

Hi all,

Added to previous improvements:


! Thumbnail loading time has been accelerated when refreshing the panel and switching pages.
! Changes have been made to the form resize and thumbnail selection events.
Other improvements.


Previous fixed versions have been removed from the forum.

Hi Sparrow, the improvements you made are great. The thumbnail loading was really slow... If I may offer a few suggestions (you've already done a lot for this project), provided you have the time and inclination:

- Some screens could be closed with "escape," especially the initial screen.

- When the initial screen has more than one page of thumbnails, two thumbnails are missing to complete the first page...

- In the slideshow presentation, making the "full screen" and "setup" buttons functional would be nice. The "setup" button could allow the user to change the display time per slide.

Thank you and best regards.