Monday, June 2, 2025

The First Time I Met My Guardian Angel


The First Time I Met My Guardian Angel


I didn’t know it at the time, but that night was the beginning of everything.

Sergeant Pete Koutrouba walked through the front door, shook my hand, and said, “Hi, Michael. I’m Pete Koutrouba from the Marines.”

I couldn’t take my eyes off his dress blues. I don’t remember how, but somehow we all ended up sitting around the kitchen table—my mom and dad at one end, me and Sergeant Koutrouba at the other, and my younger brother David sitting across from him.

Sergeant Koutrouba slid a big blue binder over to me.

“Start looking through this book. Stop when you see something you like.”

As I flipped through the pages, my dad was busy telling Navy war stories. My mom just sat there, either staring at Sergeant Koutrouba or his dress blues—I couldn’t tell which. My brother Dave, on the other hand, kept pestering him.

“Can I blow stuff up?” Dave asked eagerly.

Sergeant Koutrouba chuckled. “You like that?”

I hadn’t even realized I’d stopped flipping pages until he looked over and noticed. My fingers were resting on a picture of airplanes.

“Yeah! Can I do this stuff?”

“If you’re qualified,” he said.

I was qualified. And just like that, my boot camp date was set for July 1977. My brother and I were both signing up under the Buddy Program. My parents were thrilled to finally get David out of their hair. That night, Sergeant Koutrouba walked into our house hoping for one enlistment contract. He walked out with two.

It was a win-win.

I enlisted on March 4, 1977—nineteen days before my 18th birthday. The months leading up to boot camp are mostly a blur, but I do remember one thing: Rocky.

The movie had just come out, and something about it got to me. I left the theater with a fire in my belly. If I was going to be a Marine, I had to get in shape. So, I started running every day.

"Feeling strong now!"

The night before boot camp, I barely slept.

I had seen the movies—the ones where drill instructors go absolutely ballistic on new recruits. I spent the whole night thinking about it.

"Riley, what have you gotten yourself into?"

It was my first time on a plane.

Twenty-two of us, a bunch of kids heading straight into the unknown.

They drank. They laughed. They flirted with the stewardesses. I sat by the window, watching the sky stretch endlessly ahead.

I wasn’t in the mood for shenanigans.

My mind kept circling back to those boot camp movies—the screaming, the chaos, the way the drill instructors broke down recruits.

How bad was it going to be?

We arrived at Parris Island in the dead of night. Lightning struck. Thunder cracked. Rain pounded the bus.

As we approached the gate, I caught a glimpse of the MPs standing guard.

They were laughing. At us.

The bus kept moving. Left. Right. Right again. Then left. No landmarks. No signs. Just darkness.

The driver was doing it on purpose—disorienting us so we had no idea where we were.

Every time lightning flashed, I saw the swamp outside. Gnarled trees. Black water.

What the hell? This place is creepy.

Then, the bus stopped.

The doors hissed open.

"HURRY UP! MOVE IT! MOVE IT! MOVE IT! MOVE IT!"

The drill instructors were already screaming before our feet even hit the ground.

Rain hammered down, soaking us instantly. We rushed out, heads down, trying to shield our faces.

No time to think. No time to process. No yellow footprints.

I had seen them in every documentary, every recruitment poster. The "legendary" yellow footprints—the first step in every Marine's journey.

I never got to stand on them.

They say the yellow footprints are where every Marine begins their journey. Not me.

Instead, we were shoved inside, where they stripped us of everything.

Pockets emptied. Jewelry gone—even church necklaces.

My small book of addresses. Gone.

Everything went into a cinch sack, never to be seen again.

Or so I thought.

ZIP! ZAP!

Hair—gone.

4:30 AM. Nighty night.

Ever try sleeping right after getting your head shaved? Ugh.

Two days later, we met our drill instructors.

We sat cross-legged on the floor while the lieutenant stood in front of us, giving a speech about the Marine Corps. Behind him stood four men:

• Senior Drill Instructor Staff Sergeant Noe

• Sergeant Logue

• Sergeant Hammrick

• Sergeant Fitzpatrick

The lieutenant finished speaking.

“Senior Drill Instructor, take charge!”

And that’s when all hell broke loose.

"ON YOUR FEET!"

Everything was a blur.

Drill Instructor Sergeant Fitzpatrick got in my face and started barking orders. I snapped to attention.

“SIR, YES SIR!”

“SIR, NO SIR!”

“SIR, YES SIR!”

And that’s when I first met my guardian angel.

Amidst the chaos, a voice—clear as day—spoke inside my head.

"Everything will be all right."

It was just like in the movies. A drill instructor was four inches from my face, screaming at me, while I stood there, shouting back, “SIR, YES SIR!”

And yet, everything around me faded into the background.

Time slowed.

I was having a private conversation in my head while the world around me roared in fast motion.

"Don't laugh. I know it’s funny, but don’t laugh."

My guardian angel continued.

"If you laugh, it won’t be good. But listen, I’ve got a secret for you."

I braced myself, resisting the urge to smile.

"Boot camp is going to be a breeze. Your mother yells louder than these drill instructors."


Sunday, May 11, 2025

Delphi Tip of the Day: A Better Way to Center Modal Forms


Yesterday, I was going through some final aesthetic checks on my FMX desktop software application. I have two modal forms that popup up during click events. One is help about which I set to screen center. And the other contains code that centers the form on it's parent window.

I was testing the behavior of this form toggling between light and dark themes. I noticed that with light theme the window just appears but with the dark theme I could see the window move it's way from the top of the screen to it's centered position and then switch to dark.

In the OnShow event handler I was calculating Left and Top like I have always done to center the window. This was the first time I'd ever seen the window reposition itself. This is the first time I'd ever used a dark theme. And, this is the first major application I'd written with FMX.

Left := ParentForm.Left + (ParentForm.Width - Self.Width) div 2;
Top := ParentForm.Top + (ParentForm.Height - Self.Height) div 2;
To say the least, I was annoyed by this split second flash centering itself on the parent window. I tried all kinds of stuff to minimize this flash. Nothing work.

There's got to be a better way!

I didn't realize I had left the Position property of the form set to Default. In essence that is screen position (0,0), or the top-left corner. 

The first line of my code was moving the form horizontally from the left edge to the center of its parent. (I never saw that move happening). The second line of code was moving the form vertically from the top edge to the center of its parent (I saw this move happening).

I thought there's got to be a better way? I don't want customers seeing this screen moving like this. I tried setting the form's Visible property to False before the centering code and setting the Visible to True after. Nope, that is unauthorized. 

I tried in the OnCreate instead. Nope. I had created public properties for the forms Left and Top along with getters and setters. I created a whole elaborate scheme to support positioning this form where I wanted it.

Then it dawned on me. "Isn't there a screen position property?"

Yes, there is.
MainFormCenter! It's a thing!

FMX Form Position Property

Are you kidding me. MainFormCenter! It's a thing! When did this show up?

I immediately set the form Position property to MainFormCenter and added an Exit statement to the top of the OnShow event handler. 

And voila! 

It works like a champ. No more flashy form realignment stuff happening.

I then removed all the getters, setters, and properties I added for manually doing the form centering activity. Simple, cleaner code. 😎

BTW, the same thing exists for VCL.

VCL Form Position Property

DocWiki Links:

Enjoy
Semper Fi
Gunny Mike

https://zilchworks.com

Saturday, May 3, 2025

Delphi DOH! of the Day: Hardcoded Paths in TFDConnection.Params


I just spent two weeks tracking down an error that very easily, could have been avoided, if I hadn't been in such a rush.

I'm creating an FMX desktop application using Delphi 11.3 professional and a SQLite database which targets Windows and MacOS. I'm using a static class called TAppInfo which holds constants, variables, procedures, and functions for managing all the housekeeping bits for my application.

Inside the class constructor I'm using TPath.GetHomePath for managing paths:
//-----------------------------------------------------------------------  
// Build user paths 
//-----------------------------------------------------------------------  
ProgDataPath := IncludeTrailingPathDelimiter( TPath.GetHomePath) + VendorName + PathDelim + AppName;
Database     := ProgDataPath + PathDelim + DatabaseName;
This works great. It allows me to test both Windows and MacOS. In addition, I can easily test this on non-development machines by making sure I put the SQLite database file in the corresponding Application Path. It lets me simulate how everything would work if the application had been installed using an installer.

Everything had been going great. 
Build a little code. 
Test on Windows (my development machine). 
Test on MacOS using PAServer. 
Test on a non-development Windows machine using a thumb drive. 
All is good.

And then BOOM! 

It stopped working on the non-development test machine.

I kept getting a FireDAC SQLite error.


I couldn't figure out why all of the sudden it just crashed when I tried running it on a test machine. I spent hours creating MAP files, and testing, and asking ChatGPT to help me troubleshoot. 

I wrapped exception logic inside OnCreate event handlers. 
Nothing. 
Same error without displaying the exception logic.

"I may not be the brightest bulb on the tree..."


I may not be the brightest bulb on the tree but I knew something was different. I just couldn't figure it out or remember what I did that was different. By now two weeks has gone by and no resolution.

This morning I stripped out all the exception code and went back to square one. I looked at the project source. The only three units listed are two data modules and the main program. 

begin
  Application.Initialize;
  Application.CreateForm(TdmImages, dmImages);
  Application.CreateForm(TdmSQLite, dmSQLite);
  Application.CreateForm(TfMain, fMain);
  Application.Run;
end.
  • There's nothing SQLite related in the dmImages data module.
  • It's not getting to fMain.
  • It must be dmSQLite.
It's doesn't make sense. I've got exception logic inside the OnCreate event handler of dmSQLite but it's not firing off.

And then I had an A-Ha! moment. Right click on the dmSQLite data module and view as text!

Then I remembered what happened!

And there it was. The TFDConnection had hardcoded Params.Strings with the Database configured to a file located on my development machine and the DriverID = to SQLite.

Then I remembered what happened. I had been creating a new FastReport within the IDE. The report needed data from the SQLite database. So, I configured the TFDConnection to point to the SQLite database so I could drag and drop the database columns onto the report from within the IDE. 

Everything worked great! The report was spot on! I spent three days tweaking the report until it looked just right. I couldn't wait to test it on the non-development machine.

Ooops! I was in such a rush, I forgot to remove the hardcoded Params.Strings

I asked ChatGPT for an explanation as to why the OnCreate exception logic didn't fire. 

Explanation from ChatGPT:
  • Delphi loads the .dfm or .fmx file and instantiates all the components declared within it. 
  • This includes setting all published properties like FDConnection.Params, FDQuery1.Connection, Button1.text, etc.
  • This happens before the OnCreate event fires.
  • After all components are created and their published properties are set, OnCreate is triggered.

🛠 Your Specific Case

If TFDConnection.Params had hardcoded values (e.g. a file path or server name that doesn't exist on the test machine), they were already applied before OnCreate — meaning the connection could already try to auto-connect or be used by another component, causing a crash.

Lessons Learnt:
  1. 80 miles an hour is faster than 100 miles an hour. When you rush you make mistakes.
  2. Published Properties inside .dfm and .fmx files are set before any corresponding OnCreate event handlers.
  3. Make it a priority to View forms and data modules as text when troubleshooting.
  4. Remember Occams Razor: "The simplest explanation is usually the best one."
Enjoy,
Semper Fi
Gunny Mike
https://zilchworks.com

Thursday, March 13, 2025

Delphi FMX Air.Style Missing 'scrollboxstyle' Definition

I've been upgrading my flagship software product Zilch, from Delphi 5 VCL to Delphi 11 FMX. I'm finally in the report development phase. I'm using the FMX version of FastReports.

Things have been going along quite well, other than the typical stumbling around, which happens when learning the ins and outs of a new component suite (FastReports). 

Back in May 2024, I decided to implement a dark theme after watching Ian Barker's presentation called "The fundamental secrets of good UI design". https://www.youtube.com/live/TL2YVio_eTo

During this presentation Barker pleads with the audience to include a dark theme option because it makes life much easier for people like him. Those who suffer with severe cataracts. 

I am very meticulous about my work. Borderline obsessive. After spending nearly 4 weeks creating, tweaking, previewing, re-tweaking a report I finally decided to see what it looks like in dark mode. That's when I got hit with an access violation. 

My first reaction was WTF! 😡 


FMX.StdCtrls

I spent 3 months or more back in May 2024 testing and trying several different FMX styles. I finally settled on the Air.Style after making several customizations. And now this happens. Just when I thought I was getting close to wrapping up this project. WTF! 😡

Inside my application I'm using the StyleManager.  I call:

TStyleManager.SetStyleFromFile( <FullFilePath> )

<FullFilePath> is the full file path of the modified version of Air.Style I'm using inside my program. I remember trying Dark.Style early on but I didn't like the brownish-copper glow effect so I opted for the Air.Style.

I quickly tried setting the <FullFilePath> to Dark.Style and tested it again, IT WORKED! 😎

Okay, so there is something different between Air.Style and Dark.Style. I searched both .STYLE files looking for "TScrollBar"

It turns out that Air.Style is missing the definition for StyleName = 'scrollboxstyle'.

I copied the complete 'scrollboxstyle' definition from Dark.Style and pasted it inside Air.Style and IT WORKED!

Payoff Savings Report - Air.Style

I'm glad this was a quick fix. Here is the complete 'scrollboxstyle' definition for anyone that would like to modify the Air.Style so it works with FastReports. 

  object TLayout
    StyleName = 'scrollboxstyle'
    DesignVisible = False
    Height = 131.000000000000000000
    Position.X = 254.000000000000000000
    Position.Y = 435.000000000000000000
    Width = 334.000000000000000000
    object TLayout
      StyleName = 'background'
      Align = Contents
      Locked = True
      Height = 131.000000000000000000
      Width = 334.000000000000000000
      object TLayout
        StyleName = 'content'
        Align = Client
        Height = 115.000000000000000000
        Width = 318.000000000000000000
      end
      object TScrollBar
        StyleName = 'vscrollbar'
        Align = Right
        Height = 115.000000000000000000
        Orientation = Vertical
        Position.X = 318.000000000000000000
        Width = 16.000000000000000000
      end
      object TScrollBar
        StyleName = 'hscrollbar'
        Align = Bottom
        Height = 16.000000000000000000
        Orientation = Horizontal
        Position.Y = 115.000000000000000000
        Width = 334.000000000000000000
      end
      object TSmallScrollBar
        StyleName = 'vsmallscrollbar'
        Align = Right
        Height = 8.000000000000000000
        Orientation = Vertical
        Margins.Left = 2.000000000000000000
        Position.X = 99.000000000000000000
        Position.Y = 2.000000000000000000
        Visible = False
        Width = 8.000000000000000000
      end
      object TSmallScrollBar
        StyleName = 'hsmallscrollbar'
        Align = Bottom
        Height = 8.000000000000000000
        Orientation = Horizontal
        Margins.Top = 2.000000000000000000
        Position.X = 2.000000000000000000
        Position.Y = 113.000000000000000000
        Visible = False
        Width = 150.000000000000000000
      end
      object TLayout
        Align = Contents
        Height = 131.000000000000000000
        Width = 334.000000000000000000
        object TLayout
          Align = Bottom
          Height = 20.000000000000000000
          Position.Y = 111.000000000000000000
          Width = 334.000000000000000000
          object TSizeGrip
            StyleName = 'sizegrip'
            Align = Right
            Locked = True
            Height = 20.000000000000000000
            Position.X = 314.000000000000000000
            Width = 20.000000000000000000
          end
        end
      end
    end
  end


Update: March 16, 2025

I'll have to give the new Delph 12.3 command-line style converter tool (vsf2fm.exe) a try. Hat Tip to Ray Konopka for pointing me in this direction.


I just installed Delphi 12.3 and used the vsf2fm.exe command-line tool and converted the Carbon.vsf to Carbon.style and it works perfectly.


Update: March 18, 2025

Just tried targeting macOS and the Carbon.style looks fantastic.

Enjoy!
Semper Fi
Gunny Mike
https://zilchworks.com



Sunday, February 16, 2025

Delphi Tip of the Day: FMX FastReport Text Object (TfrxMemoView)

I've been playing around with FastReport in FMX. To be honest, I've been struggling a bit. So, today I decided to go back to square one and work through the FMX documentation on the FastReport website. https://www.fast-report.com/public_download/docs/FRVCL/online/en/index.html

"The "Text" object... No Problem.
HTML-tags in the "Text" object... Doesn't work as advertised.

The "Text" object (TfrxViewMemo) is extremely powerful. It accepts simple HTML tags that lets you modify a single text field in some really cool ways. It's kind of like a mini "Rich Text" object. 

Here is a what a working example is supposed to look like:



That is one text field with multiple effects applied to separate sections:
  • Bold
  • Italic
  • Bold and Italic
  • Superscript
  • Subscript
  • Color
I ran into an issue when I followed the example to create the "Orange" text. It didn't work. The Original example from the FastReports did not turn the text orange.


Using <font color="#FF8030"> did not display the text in orange. The text between the opening and closing font tags did not display at all. Seeing that the "red" font tag worked, I tried using the color name "orange". And it worked.


I then tried using the Alpha Color of  #FFFF8030 and it also worked.


I'm glad I was able to make the FastReport example work. The text object is very powerful. I experimented with several different Delphi Color name constants and they also worked. I did run into an issue with some of the obsolete color name constants, such as MoneyGreen. The FastReport designer did not recognize "MoneyGreen" as a valid integer. It did however take the MoneyGreen HEX equivalent of #FFC0DCC0.

I decided to create a the following cheat sheet of all the font color names that FastReport text object will recognize.

Name Color HEX Code

Aliceblue

Aliceblue

#FFF0F8FF

Antiquewhite

Antiquewhite

#FFFAEBD7

Aqua

Aqua

#FF00FFFF

Aquamarine

Aquamarine

#FF7FFFD4

Azure

Azure

#FFF0FFFF

Beige

Beige

#FFF5F5DC

Bisque

Bisque

#FFFFE4C4

Black

Black

#FF000000

Blanchedalmond

Blanchedalmond

#FFFFEBCD

Blue

Blue

#FF0000FF

Blueviolet

Blueviolet

#FF8A2BE2

Brown

Brown

#FFA52A2A

Burlywood

Burlywood

#FFDEB887

Cadetblue

Cadetblue

#FF5F9EA0

Chartreuse

Chartreuse

#FF7FFF00

Chocolate

Chocolate

#FFD2691E

Coral

Coral

#FFFF7F50

Cornflowerblue

Cornflowerblue

#FF6495ED

Cornsilk

Cornsilk

#FFFFF8DC

Crimson

Crimson

#FFDC143C

Cyan

Cyan

#FF00FFFF

Darkblue

Darkblue

#FF00008B

Darkcyan

Darkcyan

#FF008B8B

Darkgoldenrod

Darkgoldenrod

#FFB8860B

Darkgray

Darkgray

#FFA9A9A9

Darkgreen

Darkgreen

#FF006400

Darkgrey

Darkgrey

#FFA9A9A9

Darkkhaki

Darkkhaki

#FFBDB76B

Darkmagenta

Darkmagenta

#FF8B008B

Darkolivegreen

Darkolivegreen

#FF556B2F

Darkorange

Darkorange

#FFFF8C00

Darkorchid

Darkorchid

#FF9932CC

Darkred

Darkred

#FF8B0000

Darksalmon

Darksalmon

#FFE9967A

Darkseagreen

Darkseagreen

#FF8FBC8F

Darkslateblue

Darkslateblue

#FF483D8B

Darkslategray

Darkslategray

#FF2F4F4F

Darkslategrey

Darkslategrey

#FF2F4F4F

Darkturquoise

Darkturquoise

#FF00CED1

Darkviolet

Darkviolet

#FF9400D3

Deeppink

Deeppink

#FFFF1493

Deepskyblue

Deepskyblue

#FF00BFFF

Dimgray

Dimgray

#FF696969

Dimgrey

Dimgrey

#FF696969

Dodgerblue

Dodgerblue

#FF1E90FF

Firebrick

Firebrick

#FFB22222

Floralwhite

Floralwhite

#FFFFFAF0

Forestgreen

Forestgreen

#FF228B22

Fuchsia

Fuchsia

#FFFF00FF

Gainsboro

Gainsboro

#FFDCDCDC

Ghostwhite

Ghostwhite

#FFF8F8FF

Gold

Gold

#FFFFD700

Goldenrod

Goldenrod

#FFDAA520

Gray

Gray

#FF808080

Green

Green

#FF008000

Greenyellow

Greenyellow

#FFADFF2F

Grey

Grey

#FF808080

Honeydew

Honeydew

#FFF0FFF0

Hotpink

Hotpink

#FFFF69B4

Indianred

Indianred

#FFCD5C5C

Indigo

Indigo

#FF4B0082

Ivory

Ivory

#FFFFFFF0

Khaki

Khaki

#FFF0E68C

Lavender

Lavender

#FFE6E6FA

Lavenderblush

Lavenderblush

#FFFFF0F5

Lawngreen

Lawngreen

#FF7CFC00

Lemonchiffon

Lemonchiffon

#FFFFFACD

Lightblue

Lightblue

#FFADD8E6

Lightcoral

Lightcoral

#FFF08080

Lightcyan

Lightcyan

#FFE0FFFF

Lightgoldenrodyellow

Lightgoldenrodyellow

#FFFAFAD2

Lightgray

Lightgray

#FFD3D3D3

Lightgreen

Lightgreen

#FF90EE90

Lightgrey

Lightgrey

#FFD3D3D3

Lightpink

Lightpink

#FFFFB6C1

Lightsalmon

Lightsalmon

#FFFFA07A

Lightseagreen

Lightseagreen

#FF20B2AA

Lightskyblue

Lightskyblue

#FF87CEFA

Lightslategray

Lightslategray

#FF778899

Lightslategrey

Lightslategrey

#FF778899

Lightsteelblue

Lightsteelblue

#FFB0C4DE

Lightyellow

Lightyellow

#FFFFFFE0

Lime

Lime

#FF00FF00

Limegreen

Limegreen

#FF32CD32

Linen

Linen

#FFFAF0E6

Magenta

Magenta

#FFFF00FF

Maroon

Maroon

#FF800000

Mediumaquamarine

Mediumaquamarine

#FF66CDAA

Mediumblue

Mediumblue

#FF0000CD

Mediumorchid

Mediumorchid

#FFBA55D3

Mediumpurple

Mediumpurple

#FF9370DB

Mediumseagreen

Mediumseagreen

#FF3CB371

Mediumslateblue

Mediumslateblue

#FF7B68EE

Mediumspringgreen

Mediumspringgreen

#FF00FA9A

Mediumturquoise

Mediumturquoise

#FF48D1CC

Mediumvioletred

Mediumvioletred

#FFC71585

Midnightblue

Midnightblue

#FF191970

Mintcream

Mintcream

#FFF5FFFA

Mistyrose

Mistyrose

#FFFFE4E1

Moccasin

Moccasin

#FFFFE4B5

Navajowhite

Navajowhite

#FFFFDEAD

Navy

Navy

#FF000080

Oldlace

Oldlace

#FFFDF5E6

Olive

Olive

#FF808000

Olivedrab

Olivedrab

#FF6B8E23

Orange

Orange

#FFFFA500

Orangered

Orangered

#FFFF4500

Orchid

Orchid

#FFDA70D6

Palegoldenrod

Palegoldenrod

#FFEEE8AA

Palegreen

Palegreen

#FF98FB98

Paleturquoise

Paleturquoise

#FFAFEEEE

Palevioletred

Palevioletred

#FFDB7093

Papayawhip

Papayawhip

#FFFFEFD5

Peachpuff

Peachpuff

#FFFFDAB9

Peru

Peru

#FFCD853F

Pink

Pink

#FFFFC0CB

Plum

Plum

#FFDDA0DD

Powderblue

Powderblue

#FFB0E0E6

Purple

Purple

#FF800080

Red

Red

#FFFF0000

Rosybrown

Rosybrown

#FFBC8F8F

Royalblue

Royalblue

#FF4169E1

Saddlebrown

Saddlebrown

#FF8B4513

Salmon

Salmon

#FFFA8072

Sandybrown

Sandybrown

#FFF4A460

Seagreen

Seagreen

#FF2E8B57

Seashell

Seashell

#FFFFF5EE

Sienna

Sienna

#FFA0522D

Silver

Silver

#FFC0C0C0

Skyblue

Skyblue

#FF87CEEB

Slateblue

Slateblue

#FF6A5ACD

Slategray

Slategray

#FF708090

Slategrey

Slategrey

#FF708090

Snow

Snow

#FFFFFAFA

Springgreen

Springgreen

#FF00FF7F

Steelblue

Steelblue

#FF4682B4

Tan

Tan

#FFD2B48C

Teal

Teal

#FF008080

Thistle

Thistle

#FFD8BFD8

Tomato

Tomato

#FFFF6347

Turquoise

Turquoise

#FF40E0D0

Violet

Violet

#FFEE82EE

Wheat

Wheat

#FFF5DEB3

White

White

#FFFFFFFF

Whitesmoke

Whitesmoke

#FFF5F5F5

Yellow

Yellow

#FFFFFF00

Yellowgreen

Yellowgreen

#FF9ACD32

Osolete Color Names Use HEX Code

LtGray

LtGray

#FFC0C0C0

MedGray

MedGray

#FFA0A0A0

DkGray

DkGray

#FF808080

MoneyGreen

MoneyGreen

#FFC0DCC0

LegacySkyBlue

LegacySkyBlue

#FFF0CAA6

Cream

Cream

#FFF0FBFF



Enjoy!
Semper Fi
Gunny Mike

Thursday, January 2, 2025

Tip of the Day - Everyday is an Etch-A-Sketch

Sometimes all you need is a little motivation.

Everyday is an Etch-A-Sketch.



Sometimes, every hour is an Etch-A-Sketch.

And sometimes, every minute is an Etch-A-Sketch.


Happy New Year,
Gunny Mike